ロックを避けるためにスクリプトをシェルにパイプ

ロックを避けるためにスクリプトをシェルにパイプ

シェルに出力を含めるwgetかパイピングするプロジェクト設定のガイドラインがますます増えています。curlNVMで初めて見たようです。

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

おすすめ記事