我经常在网上看到用不同符号连接各种命令的教程。例如:
command1 | command2
command1 & command2
command1 || command2
command1 && command2
Run Code Online (Sandbox Code Playgroud)
其他人似乎将命令连接到文件:
command1 > file1
command1 >> file1
Run Code Online (Sandbox Code Playgroud)
这些是什么?他们叫什么?他们在做什么?还有更多吗?
作为 Linux 用户,我一直只使用 bash,因为它是我使用的每个发行版的默认设置。使用其他 Unix 系统(如 BSD)的人似乎更频繁地使用其他 shell。为了多学习一点,我决定尝试一下 zsh。
作为 bash 用户:
在 bash 中,你有这个方便的变量: $BASHPID ,它总是返回当前运行的子 shell 的 PID。如何在 ksh 中获取子 shell 的 PID?例如看下面的代码:
#!/usr/bin/ksh93
echo "PID at start: $$"
function run_in_background {
echo "PID in run_in_background $$"
run_something &
echo "PID of backgrounded run_something: $!"
}
function run_something {
echo "*** PID in run_something: $$"
sleep 10;
}
run_in_background
echo "PID of run in background $!"
Run Code Online (Sandbox Code Playgroud)
这将输出以下内容:
PID at start: 5328
PID in run_in_background 5328
*** PID in run_something: 5328
PID of backgrounded run_something: 5329
PID of run in background …Run Code Online (Sandbox Code Playgroud) 我有一个包含一长串文件名(带有完整路径)的文件。我还有一个我想多次运行的程序,使用此列表中的一个和一个文件名作为参数。我想运行的程序很遗憾是一个自制的脚本;所以它一次只能取一个文件名,并且它不能接受来自stdin 的输入(如文件名列表)——所以不可能进行管道或输入重定向。
我需要的是一个命令,它将运行另一个命令(我的脚本),使用文件中的行作为参数。
喜欢的东西find与-exec-action ...( find . -name "*.txt" -exec command \;)。我想我实际上可以find在这里使用,但我希望对输入文件进行排序......
所以我需要的是这样的:
for_each_command1 -f list_of files -c './my_command {}'
for_each_command2 -f list_of_files -exec ./my_command {} \;
for_each_command3 -c './my_command {}'
我处理此类任务的常用方法是sed- 不幸的是,有很多开销而且它并不漂亮(但它确实有效......):
$ wc -l list_of_files
232
$ for (( i=1; 我愿意
> ./my_command "`sed -n "${i}p" list_of_files`"
> 完成
那么是否有内置的命令或 shell 来处理这样的事情?
由于这两个ksh和bash是基于sh很多的Korn Shell脚本(KSH)将简称为伯恩-再次Shell脚本(bash)的一次家当和文件扩展名被改变运行,
而你调用$ bash script.bash而不是$ ksh script.ksh.
我有一个基本脚本来替换名为“files”的目录中出现的任何 ksh 并更改脚本的文件扩展名。
#!/bin/bash/
#replace instances
find ./files -type f - exec sed -i.bak "s/ksh/bash/g" {} \;
#Change extensions
for f in ./files/*.ksh;
do mv "$f" "./files/""$(basename "$f" .ksh).bash"
done
#Clean up
rm ./files/*.bak
Run Code Online (Sandbox Code Playgroud)
该脚本可以工作并执行上述操作,但是是否足以将任何 ksh 脚本转换为 bash,或者是否存在我未考虑的条件?
bash ×3
shell-script ×3
ksh ×2
shell ×2
command-line ×1
control-flow ×1
conversion ×1
subshell ×1
zsh ×1