Bash readlineはパイプになるとすべてを食べます。

Bash readlineはパイプになるとすべてを食べます。

簡単なスクリプトがあります。

# test.sh

read -p ">> " user
read -p ">> " -n1 yes

echo

echo "user: $user"
echo "yes: $yes"

実行すると、値の入力を求められ、その値がsumbash test.sh変数に保存されます。だから出力は次のようになりますuseryes

user@host:~/static/dcc$ bash test.sh 
>> foo
>> b
user: foo
yes: b

しかし、cat test.shがbashにパイプされていると機能しません。代わりに、読み込みはuser入力を要求せず、その後のすべてを食べて変数に保存します。

user@host:~/static/dcc$ cat test.sh | bash

user: read -p ">> " -n1 yes
yes: 

プロセスオーバーライドではうまくいきますが、bashがsudoで実行されている場合は機能しません(これは私が必要とするものです)

user@host:~/static/dcc$ bash <(cat test.sh)
>> user
>> y
user: user
yes: y
user@host:~/static/dcc$ sudo bash <(cat test.sh)
bash: /dev/fd/63: No such file or directory

実際のケースでは、カールを使用してネットワークからスクリプトを取得し、 sudo を使用しているかのように実行しようとしています。可能であれば、スクリプトを最初にダウンロードする追加の手順を避けたいと思います。

ベストアンサー1

まあ、readstdinから読んだ後、stdinを通して残りのスクリプトを提供します...したがって動作しません。

このファイルをダウンロードする必要があります。代替トリックはうまく機能しますが、うまく機能します。 sudo が呼び出されるシェルではなく、sudo が呼び出されるシェルで実行されます。これを簡単に回避できます。

sudo bash -c 'bash <(curl https://scripttodownload)'

おすすめ記事