Shell 子命令输出到父命令

mim*_*mmi 0 bash shell command pipe

我有一个单行命令,让我们说

grep needle haystack.file
Run Code Online (Sandbox Code Playgroud)

如果我想使用 pwd 命令用当前工作目录替换“needle”怎么办。现在可能可以使用管道,但我需要针部分来显示工作目录和命令的其余部分是相同的。

所以最好是这样的:

grep (pwd) haystack.file
Run Code Online (Sandbox Code Playgroud)

执行时实际上会运行以下命令:

grep /var/www/html/ haystack.file
Run Code Online (Sandbox Code Playgroud)

我做了一些搜索,发现了很多带有管道的例子,但它不能应用于我的场景,因为第一部分 (grep) 和第二部分 (haystack.file) 在应用程序中是固定的。

fed*_*qui 5

使用$PWD变量,始终设置:

grep "$PWD" haystack.file
Run Code Online (Sandbox Code Playgroud)

您还可以使用命令替换:

grep "$(pwd)" haystack.file
Run Code Online (Sandbox Code Playgroud)

注意引号的重要性。做吧!否则可能会发生奇怪的事情。

  • @MarcB 确实如此,但实际上没有理由在 `"$(pwd)"` 上使用 `\`pwd\`,并且有很多理由不这样做。 (2认同)

nu1*_*73R 5

您可以使用命令替换

测试

$ echo $(pwd) > test
$ grep $(pwd) test
/home/xxx/yyy
Run Code Online (Sandbox Code Playgroud)

或者

$ grep `pwd` test
/home/xxx/yyy
Run Code Online (Sandbox Code Playgroud)

安全

始终建议引用命令替换以处理pwd命令输出中的空格

测试

$ pwd
/home/xxx/yyy/hello world
$(pwd) > test

$ grep $(pwd) test #without quoting
grep: world: No such file or directory
test:/home/xxx/yyy/hello world

$ grep "$(pwd)" test #with quoting
/home/xxx/yyy/hello world
Run Code Online (Sandbox Code Playgroud)