一般来说,我发现将 bash 命令彼此(即复合命令)或变量一起使用会相当混乱。没有什么能像我期望的那样工作。命令需要不同的输入类型(例如 echo 接受字符串,而 find 接受文件名),并且有许多方法可以将信息从一个命令传输到另一个命令(例如 xargs、管道、here-strings ( <<<
) 和命令扩展 ( $(command)
))。当相互使用命令时,我永远不确定将信息从一个命令传递到另一个命令的正确方法,因此它会按我的预期工作。
一些例子:如果我这样做echo $VAR
,它期望变量是一个字符串。如果我这样做grep pattern $VAR
,它将期望我的变量是路径名,而不是字符串。要让 grep 将其视为字符串,我必须这样做echo $VAR | grep pattern
。因此,为了获得相同的预期读数,我必须为不同的命令输入不同的信息。
另一个例子:我最近想在我的$PATH
. 我花了很长时间反复试验才发现我可以使用ls $(sed 's/:/ /g' <<< "$PATH") | grep searchstring
. 由于我无法将参数输入ls
,似乎grep
可以从标准输入读取参数并且ls
不能?
具体来说,我想回答的一些问题是:
- 我怎么知道哪些命令需要什么类型的输入?
- 在命令(或短语)之间传递信息的不同方法之间的有效和语义差异是什么?
- 可以在这里有用地使用重定向的输入和输出吗?
- 如何在输入类型之间进行更改(例如,如果它需要一个文件名,但我想给它一个字符串)
- 我的复合命令将被解析的规则是什么?
- 奖励:在上述方法中,我可以在哪里以及如何使用 bash 扩展等(例如,我可以在输入信息后进行 bash 扩展)?