"which"コマンドは#!/bin/bashを使用するシェルスクリプトでは機能しませんが、#!/bin/zshを使用すると機能します。

"which"コマンドは#!/bin/bashを使用するシェルスクリプトでは機能しませんが、#!/bin/zshを使用すると機能します。

shファイルがあります。

#!/bin/bash
echo $PATH
date
pwd
which nano

最初の3行は#!/bin/bashと#!/bin/zshで動作しますが、./script.sh: line 5: which: command not foundbashを取得しましたが、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したがって、スクリプトの移植性を最大化するには、この機能を使用してスクリプトに独自のバージョンを含めることをお勧めします。

関連情報