シェルに出力を含めるwget
かパイピングするプロジェクト設定のガイドラインがますます増えています。curl
NVMで初めて見たようです。
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash
したがって、これはスクリプトファイルをbashにパイプする際に発生するいくつかの問題(ファイルのロックと権限)に対する簡単な解決策のようです。
cat script.sh | bash
Bashは私の母国語ではなく、これが禁止されているのか、私の問題を解決するより良い方法があるのか疑問に思います。
(私のスクリプトはgitリポジトリから最新バージョンを取得し、プロセスで自分自身を置き換えます。または少なくともそれを行う必要がありますが、実行スクリプトのロックのためにそれを行うことはできません。そうしないと、置換ファイルは消去されます。+ xフラグです。箱を確認してください)
ベストアンサー1
私はあなたの問題が別の場所にあると思います。独自に変更されるロックスクリプトはありません。
a.sh
たとえば、次の2つのスクリプトを生成できますb.sh
。
#!/bin/sh
# a.sh
cp a.sh tmp.sh
cp b.sh a.sh
mv tmp.sh b.sh
echo A
#!/bin/sh
# b.sh
cp a.sh tmp.sh
cp b.sh a.sh
mv tmp.sh b.sh
echo B
これで魔法を唱えることができます。
$ a.sh
A
$ a.sh
B
$ a.sh
A
この場合、実行フラグは失われません。
スクリプトパイピングの唯一の利点bash
は、コマンドがスクリプトを生成し、そのスクリプトを実際のファイルに保存したくない場合です。例では、すぐにcurl
ダウンロードしてinstall.sh
実行します。パイプがない場合は、次の3行になります。
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh >tmp.sh
$ bash tmp.sh
$ rm tmp.sh
パイプcat
$ cat script.sh | bash
機能的にはsimpleと同じですbash script.sh
。