将脚本的输出作为参数通过管道传输到下一个命令

将脚本的输出作为参数通过管道传输到下一个命令

我正在尝试从 perl 脚本中获取信息,并通过管道传输到下一个命令以在码头工人脚本(因此需要在单个管道中执行)。出于某种原因,命令的标准输出无法正常工作。

以下是我想做的事情:

# perl -e '($prefix) = `nginx -V 2>&1` =~ /configure arguments: (.*)/; print $prefix;' | ../configure $(</dev/stdin) --add-dynamic-module=nginx-upload-module-master

如果我尝试回显第一个命令的标准输入,则它不会产生任何输出。

# perl -e '($prefix) = `nginx -V 2>&1` =~ /configure arguments: (.*)/; print $prefix;' | echo $(</dev/stdin)

# 

知道为什么它没有像我怀疑的那样工作吗?我正在使用 dash shell。

ps 我知道第一个命令运行正常:

# perl -e '($prefix) = `nginx -V 2>&1` =~ /configure arguments: (.*)/; print $prefix;'
--with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-YlUNvj/nginx-1.14.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module

答案1

Dash 支持$(…)命令替换,但</dev/stdin不是输出任何内容的命令。它只是一种重定向。

在 Bash 中$(<file)相当于$(cat file),但它是一种特殊情况,是一种为方便用户而支持的语法。显然它在 Dash 中不受支持。

如果您希望它$(</dev/stdin)本身在 Dash 中像您预期的那样工作,请使用。但我首先$(cat /dev/stdin)不认为这是一种好方法。我可以看到第一个命令输出一个包含单引号的字符串,这些字符串应该被解释。输出中的引号是为了保护一些空格。命令替换不会解释引号。当然,不加引号会在错误的地方分割字符串,但如果你$(…)$(cat /dev/stdin)引用它那么它将形成一个单一的论点;无论如何引号仍然会存在。

第一个命令中的字符串可能应该与xargs或一起使用或许eval。我不知道nginx -V,所以我不能肯定地说。

你可以这样做xargs

perl -e '($prefix) = `nginx -V 2>&1` =~ /configure arguments: (.*)/; print $prefix;' \
| xargs ../configure --add-dynamic-module=nginx-upload-module-master

xargs将解释引号,因此它将从中创建一个单一参数--with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-YlUNvj/nginx-1.14.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2'

相关内容