PATH
シェルスクリプトを使用して特定のプログラムへのパスを見つける必要があります。パスはプログラムの実際のフルパスでなければならず、後でそれ自体をexec*
検索しない関数の1つPATH
(たとえば)に渡すことができますexecv
。
kill
たとえば、実際のプログラムと組み込みシェル機能を同時に実行するプログラムがあります。この場合、実際のプログラムへのフルパスが必要です。
PATH
指定されたプログラムを見つけるために使用できるいくつかのユーティリティがあります。セクション2.9.1.1, POSIX標準コマンドの検索と実行。
はいwhich
、どの規格にも属しません。一部のシステムでは通常のプログラムである可能性がありますが、一部のシェルでは組み込みプログラムとして提供されます。ほとんどのシステムとシェルで動作しているように見えますが、組み込み機能を持つシェルも実行可能ファイルへのパスではなく、組み込み名のみを返します。また、何らかの方法で標準化されておらず、出力を返し、他のオプションを使用することもできます。
bash# which kill
/usr/bin/kill
dash# which kill
/usr/bin/kill
fish# which kill
/usr/bin/kill
mksh# which kill
/usr/bin/kill
tcsh# which kill
kill: shell built-in command.
zsh# which kill
kill: shell built-in command
はいwhence
、複数のシェルが組み込まれています。ただし、多くのシェルでは使用できません。また、プログラムパスの代わりに組み込み関数の名前を返します。この動作を変更するためにAを渡すことができます-p
。
bash# whence kill
bash: whence: command not found
dash# whence kill
dash: 1: whence: not found
fish# whence kill
fish: Unknown command 'whence'
mksh# whence kill
kill
mksh# whence -p kill
/usr/bin/kill
tcsh# whence kill
whence: Command not found.
zsh# whence kill
kill
zsh# whence -p kill
/usr/bin/kill
一部はcommand
POSIX:2008 指定内蔵。残念ながら、通常のコマンドと組み込みコマンドも検索して、同じ名前の組み込みコマンドによって隠されたプログラムパスの代わりに組み込みコマンドの名前を返します。一部の古いシェルはまだそれを実装していません。
bash# command -v kill
kill
dash# command -v kill
kill
fish# command -v kill
/usr/bin/kill
mksh# command -v kill
kill
tcsh# command -v kill
command: Command not found.
zsh# command -v kill
kill
答え1
行って自分で見つけてください。
export IFS=":"
[ -z "${1}" ] && exit 1
for dir in $PATH
do if [ -x "${dir}/${1}" ]
then echo "${dir}/${1}"
exit 0
fi
done
echo ${1} not found
exit 1
bash
, dash
, ksh
, でテストmksh
済みzsh
修正する
上記はスタンドアロンスクリプトには適していますが、より大きなスクリプトに含めたい場合は、次のようなものを使用することをお勧めします。
function find_path() {
IFS_SAVE="${IFS}"
export IFS=":"
[ -z "${1}" ] && return 1
for dir in $PATH
do if [ -x "${dir}/${1}" ]
then echo "${dir}/${1}"
export IFS="${IFS_SAVE}"
return 0
fi
done
export IFS="${IFS_SAVE}"
echo ${1} not found
return 1
}
これはIFS
、一致するものを見つけて回復し、exit
「をreturn
」に置き換えることです。