标签: process-substitution

exec > 如何处理 AWS EC2 用户数据?

我正在为 AWS EC2 编写一个 Terraform 模块,其中涉及在用户数据部分执行 bash。当我开发时,我编写的脚本中遇到了问题,但 AWS 和 Terraform 都没有提供任何错误日志,直到我在 AWS 支持论坛中找到这一行:

exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1
Run Code Online (Sandbox Code Playgroud)

user_data这一行成功写入了脚本执行的所有输出/var/log/user-data.log,但我不理解整行。我知道exec >将所有输出写入一个文件,在这种情况下>(..),但我不明白为什么使用它tee或需要那里的管道。

bash io-redirection process-substitution exec

2
推荐指数
1
解决办法
370
查看次数

进程替换中fd分配的顺序

受到这个答案的启发https://security.stackexchange.com/a/166645 我想知道当我运行这些命令时奇怪的排序背后的原因:

root@6cb8704148bf:/usr/app# echo <(printf "111")
/dev/fd/63
root@6cb8704148bf:/usr/app# echo <(printf "111")
/dev/fd/63
root@6cb8704148bf:/usr/app# echo <(printf "111") <(printf "222")
/dev/fd/63 /dev/fd/62
Run Code Online (Sandbox Code Playgroud)

到目前为止,这似乎有些正常。然后我想知道如果你继续降到 0 会发生什么。

root@6cb8704148bf:/usr/app# echo <(printf "111") <(printf "222") <(printf "222")  <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") <(printf "222") …
Run Code Online (Sandbox Code Playgroud)

bash file-descriptors process-substitution

2
推荐指数
1
解决办法
174
查看次数

子shell和进程替换

抱歉,如果这是一个基本问题 - 我一直在试图解决一个更大的问题,这归结为如何调用 shell 脚本 - 直接 ( shellScript.sh) 或使用sh shellScript.sh.

这是问题的模型:

当我在 bash 上执行时:

cat <(echo 'Hello')
Run Code Online (Sandbox Code Playgroud)

我看到输出

Hello
Run Code Online (Sandbox Code Playgroud)

但是当我使用:

sh -c "cat <(echo 'Hello')"
Run Code Online (Sandbox Code Playgroud)

我看到错误:

sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `cat <(echo 'Hello')'
Run Code Online (Sandbox Code Playgroud)

我试过转义<,()各种组合,但我在任何地方都看不到输出。我在这里缺少什么?

我的实际问题是我将 a<()作为输入参数传递给shell 脚本中的 python 脚本,虽然当我仅使用名称调用 shell 脚本时它工作正常,但如果我sh用来调用它,我会得到类似的错误我在上面显示的内容。

谢谢!

process-substitution subshell

1
推荐指数
1
解决办法
1407
查看次数

等同于使用过程替换?

是进程替换的用法

command1 <(command2)
Run Code Online (Sandbox Code Playgroud)

相当于

command2 > ~/myfile
command1 ~myfile
Run Code Online (Sandbox Code Playgroud)

?

以上两个可以互相替换吗?

command1command2在命令替换的使用中是否总是同时运行,而在“替换”中command1仅在command2运行完成后运行?

如果是,这种差异是否会使两者不等价并且在某些情况下并不总是相互替换?

谢谢。

bash process-substitution

0
推荐指数
1
解决办法
58
查看次数

进程替换是否需要双引号?

双引号命令替换是一个很好的做法。进程替换(<()>())是否相同?

双引号似乎允许命令替换,但不允许进程替换:

$ echo <(printf "%s" hello)
/dev/fd/63
$ echo "<(printf "%s" hello)"
<(printf %s hello)
Run Code Online (Sandbox Code Playgroud)

如果任何进程替换的结果包含空格,或者这永远不会发生怎么办?

谢谢。

bash quoting process-substitution

-4
推荐指数
1
解决办法
232
查看次数