【问题标题】:Shell subcommand output to parent commandShell 子命令输出到父命令
【发布时间】:2015-02-11 07:25:38
【问题描述】:

我有一个单行命令,比如说

grep needle haystack.file

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

所以最好是这样的:

grep (pwd) haystack.file

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

grep /var/www/html/ haystack.file

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

【问题讨论】:

    标签: bash shell command pipe


    【解决方案1】:

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

    grep "$PWD" haystack.file
    

    您也可以使用命令替换:

    grep "$(pwd)" haystack.file
    

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

    【讨论】:

    • grep `pwd` haystack.file 也可以,只要路径中没有 IFS 字符。
    • 是的!只是我倾向于不使用``:它们不能嵌套:(
    • @MarcB 确实如此,但实际上没有理由使用`pwd` 而不是"$(pwd)",还有很多理由不这样做。
    【解决方案2】:

    您可以使用命令替换

    测试

    $ echo $(pwd) > test
    $ grep $(pwd) test
    /home/xxx/yyy
    

    $ grep `pwd` test
    /home/xxx/yyy
    

    安全

    始终建议引用命令替换来处理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
    

    【讨论】: