shファイルがあります。
#!/bin/bash
echo $PATH
date
pwd
which nano
最初の3行は#!/bin/bashと#!/bin/zshで動作しますが、./script.sh: line 5: which: command not found
bashを取得しましたが、zshはファイルを正しく実行します。なぜ?
zshでbashシェルを入力してbash
入力すると、次の結果type which
が表示されます。
which is aliased to `_which'
ただし、zshにいてtypeを入力すると、次の結果がbash -c "type which"
表示されます。
bash: line 0: type: which: not found
答え1
すべてのコマンドが別々の実行可能ファイルとして存在するわけではありません。一部のコマンドは組み込み使用中のシェルに。
明らかにまだインストールされていないようです/usr/bin/which
(配布版の一部のパッケージでこれを提供することもできます)。
出力type which
によると、which
コマンドはbash
実際にはエイリアスであり、エイリアスは次の目的でのみbash
使用されます。インタラクティブシェル。これはおそらく、そのうちの1つから始まるいくつかのスクリプトで/etc/bash.bashrc
定義されていることを意味します。~/.bashrc
実行時bash
非対話型(例bash -c "type which"
:)/etc/bash.bashrc
とは~/.bashrc
スキップされているため、エイリアスは定義されていません。
_which
その結果、これはシェル関数でもあります。これを使用して定義を表示できますtype _which
。おそらく次のようなものかもしれません。
which() {
IFS=:
for x in $PATH; do
if [ -x "$x/$1" ]; then
echo "$x/$1"
return 0
fi
done
echo "$1 not found in \$PATH"
return 1
}
which
したがって、スクリプトの移植性を最大化するには、この機能を使用してスクリプトに独自のバージョンを含めることをお勧めします。