想象一下,您有一个愚蠢的脚本 test.sh,向其中传递的参数如下所示:
bash test.sh arg1 arg2 arg3
test.sh 是一个愚蠢的脚本,显示其命令行:
#!/bin/bash
echo "$0 $*"
我想使用 bash heredoc << 将脚本提供给 bash 来执行相同的操作。所以我尝试了这个:
bash <<'EOF' -- arg1 arg2 arg3
echo "$0 $*"
EOF
但它因错误而失败
bash: arg1: No such file or directory
任何想法 ?
答案1
这里的文档通过其标准输入传递到内部 bash。您需要指示 bash 从标准输入读取。如果没有命令行参数,这会自动发生。如果至少有一个非选项参数并且没有-s
或-c
选项,则第一个非选项参数是要运行的脚本文件的名称。您可以传递-s
选项来告诉 bash 从标准输入读取。
bash <<'EOF' -s -- arg1 arg2 arg3
echo "$0 $*"
EOF
答案2
或者,在大多数系统上,您可以执行以下操作:
bash /dev/fd/3 3<< 'EOF' arg1 arg2 arg3
echo "$0 $*"
IFS= read -rp "Enter something: "
printf 'You entered: "%s"\n' "$REPLY"
EOF
这样,您的此处脚本仍然可以访问标准输入。