愚かなスクリプト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に指示する必要があります。これはコマンドライン引数なしで自動的に発生します。オプション以外の引数が1つ以上ある場合、またはオプションがない場合、最初の-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
これにより、ここのスクリプトはまだ標準入力にアクセスできます。