我正在为 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或需要那里的管道。
受到这个答案的启发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) 抱歉,如果这是一个基本问题 - 我一直在试图解决一个更大的问题,这归结为如何调用 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用来调用它,我会得到类似的错误我在上面显示的内容。
谢谢!
是进程替换的用法
command1 <(command2)
Run Code Online (Sandbox Code Playgroud)
相当于
command2 > ~/myfile
command1 ~myfile
Run Code Online (Sandbox Code Playgroud)
?
以上两个可以互相替换吗?
command1和command2在命令替换的使用中是否总是同时运行,而在“替换”中command1仅在command2运行完成后运行?
如果是,这种差异是否会使两者不等价并且在某些情况下并不总是相互替换?
谢谢。
双引号命令替换是一个很好的做法。进程替换(<()和>())是否相同?
双引号似乎允许命令替换,但不允许进程替换:
$ echo <(printf "%s" hello)
/dev/fd/63
$ echo "<(printf "%s" hello)"
<(printf %s hello)
Run Code Online (Sandbox Code Playgroud)
如果任何进程替换的结果包含空格,或者这永远不会发生怎么办?
谢谢。