【问题标题】:Use output of a command for another将命令的输出用于另一个
【发布时间】:2019-06-13 08:27:39
【问题描述】:

在我的本地机器上,我的可执行文件存储在

.stack-work/install/x86_64-osx/lts-13.0/8.6.3/bin/nonosolver-exe

在我的云实例中,它存储在

./.stack-work/install/x86_64-linux-tinfo6/lts-13.0/8.6.3/bin/nonosolver-exe

因此,可执行文件将始终位于./.stack-work/install/{??}/nonosolver-exe 中,具体取决于我使用的机器和 GHC 版本。所以在我的make文件中我正在使用

find ./.stack-work/install -name nonosolver-exe

找到我的可执行文件。


如何获取find 的结果以使用setsid 启动守护进程(取自here):

setsid {path to executable} >/dev/null 2>&1 < /dev/null &

我试过了(取自here):

find ./.stack-work/install -name nonosolver-exe -exec setsid {} >/dev/null 2>&1 < /dev/null &

无济于事

【问题讨论】:

    标签: linux bash shell command-line


    【解决方案1】:

    壳牌

    使用$(...) 将一个命令的标准输出作为字符串插入另一个命令:

    setsid "$(find ./.stack-work/install -name nonosolver-exe)" >/dev/null 2>&1 < /dev/null &
    

    如果您最终找到多个匹配项而不是一个,这将导致意外问题。您可以先存储到变量中进行错误检查:

    exe_path="$(find ./.stack-work/install -name nonosolver-exe)"
    # check non-empty and no newlines
    setsid "${exe_path}" >/dev/null 2>&1 < /dev/null &
    

    生成文件

    等效于 bash $(...) 构造的 makefile 是 $(shell ...)。并且变量用$(...)扩展,而不是${...}

    setsid "$(shell find ./.stack-work/install -name nonosolver-exe)" >/dev/null 2>&1 < /dev/null
    

    或者

    EXE_PATH = $(shell find ./.stack-work/install -name nonosolver-exe)
    setsid "$(EXE_PATH)" >/dev/null 2>&1 < /dev/null
    

    【讨论】:

    • 您的解决方案在命令行上运行良好,但是当我将它放入 makefile 时,“${..}”表达式解析为“”。有什么想法吗?
    • Shell 变量和 make 变量的语法并不完全相同。我会更新
    • EXE_PATH 有效,makefile 输出为EXE_PATH=./.stackwork/.../nonosolver-exe,但进程未启动。然后我用echo "$(EXE_PATH)" 进行了测试,它显示echo "" 所以我猜setsid 也没有进入EXE_PATH。
    • 我使用了setsid "$(shell find ./.stack-work/install -name nonosolver-exe)" &gt;/dev/null 2&gt;&amp;1 &lt; /dev/null &amp;,现在可以使用了,谢谢
    • 管道呢?到 xargs?
    【解决方案2】:

    使用管道和 xargs:

    find ./.stack-work/install -name nonosolver-exe -print0 | xargs -0 -I{} setsid "{}" >/dev/null 2>&1 < /dev/null &
    

    【讨论】:

    • 这在 makefile 中的效果与在 shell 中的效果一样好。非常+1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多