1

失敗したメモリを非常に小さなシェル スクリプトに置き換えたいと考えています。

#!/bin/sh
if ! [ –a $1.sav ]; then
    mv $1 $1.sav
    cp $1.sav $1
fi
nano $1 

スクリプトの元のバージョンを保存するためのものです。オリジナルが以前に保存されていた場合、move-and-copy-back をスキップします (私は move-and-copy-back を使用して元のタイムスタンプを保存しています)。

chmodで実行可能にした後、編集中のディレクトリ内から起動すると、これは意図したとおりに機能します。

./safe.sh filename

ただし、移動して/usr/binから別のディレクトリで実行しようとすると (先頭の なし./)、次のように失敗します。

*-bash: /usr/bin/safe.sh: /bin/sh: bad interpreter: Text file busy*

私の質問は、このスクリプトをパス (によって検証echo $PATH) に移動すると、なぜ失敗するのでしょうか?

ああ?探究心は、これを機能させる方法を知りたがっています。

4

2 に答える 2

3

この.コマンドは通常、スタンドアロン スクリプトの実行には使用されないため、混乱しているようです。.通常は、環境に新しいバインドを追加するために対話的に使用されます (シェル関数の定義など)。また、スクリプト内で同様の効果を得るためにも使用されます (たとえば、スクリプト「ライブラリ」をロードするため)。

スクリプトを実行可能としてマークすると (質問のコメントに従って)、現在のディレクトリ (例: ./safe.sh filename) またはパス内のどこからでも(例: ) 実行できるようになりますsafe.sh filename

.shコマンド名の通常の規則に合わせて、名前から削除することもできます。

Ifところで:スクリプトで誤って大文字を使用していることに注意してください。

于 2013-10-22T23:36:28.887 に答える