将命令输出用于另一个

时间:2019-01-19 06:43:01

标签: linux bash shell command-line

在我的本地计算机中,我的可执行文件存储在

.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的计算机和版本。所以在我的文件中,我正在使用

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 &

无济于事

2 个答案:

答案 0 :(得分:2)

外壳

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

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

答案 1 :(得分:1)

使用管道和xargs:

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