からインスピレーションを受けるこの回答:type -p
コマンドプロンプトで実行すると、コマンドが存在する場合にパスを確実に通知します。
pi@raspberrypi:~ $ type -p less
/usr/bin/less
pi@raspberrypi:~ $ type -p asdf
pi@raspberrypi:~ $
ただし、スクリプトで使用されている場合、パラメータはそれ自体がコマンドであるかの-p
ように解釈されます。type
結果には常にいくつかの不良テキストがあるため、コマンドはオプションでそれを無視するようです。-p not found
スクリプトの残りの部分が中断されます。
#!/usr/bin/sh
main() {
for mycommand in $1; do
echo Checking $mycommand
loc="$(type -p "$mycommand")"
echo $loc
if ! [ -f "$loc" ]; then
echo I think I am missing $mycommand
fi
done
}
main "less asdf"
スクリプト出力:
Checking less
-p: not found less is /usr/bin/less
I think I am missing less
Checking asdf
-p: not found asdf: not found
I think I am missing asdf
助けてください?この問題を引き起こすRaspberry Piケースに問題がありますか?
答え1
-p
type
このコマンドの標準オプションではありません。type
標準にもかかわらず、ユーティリティ自体はPOSIXではオプションです(UNIX準拠の認証を取得するために必要ですが、XSIを実装するシステムにのみ必要です)。
type
command -v
代わりに、コマンドの可用性を確認するために使用できます。出力を確認せずに、終了状態を介してコマンドが正常に検出されたかどうか(組み込みコマンド、関数内の外部コマンド内に見つかったかcommand
どうか)を確認できます。$PATH
#!/usr/bin/sh -
main() {
for mycommand do
printf >&2 '%s\n' "Checking $mycommand"
if ! command -v -- "$mycommand" > /dev/null 2>&1; then
printf >&2 '%s\n' "I think I am missing $mycommand"
fi
done
}
main less asdf
command
必須 POSIX ユーティリティです。この-v
オプションは以前はcommand
オプションでしたが、最新バージョンの POSIX 仕様ではもう使用できません。
また覚えてくださいecho
任意のデータの表示には使用できません。、--
オプションと非オプションを区別するために使用する必要があり、エラー(および進行/アドバイス情報を含む一般的な診断)はstderrに移動することをお勧めします。
ただし、、、およびshells²type
でデフォルトでサポートされているオプションです。とは標準(例えば返されたコマンド)からコマンドを検索することを意味し、 ではエイリアス/組み込み機能/関数でのみコマンドを検索するという意味です。見つかったコマンドのパスのみを印刷する点を除いては同じです。 In(以前はそうでしたが文書化されていないがまだサポートされています)は成功しますが、コマンドが組み込まれている場合は何も印刷せず、ksh93などの外部コマンドの場合にのみパスを印刷します。では、次のように動作します。bash
mksh
ksh93
busybox ash
zsh
yash
mksh
yash
$PATH
getconf PATH
zsh
$PATH
ksh93
bash
-path
type -p
busybox ash
command -v
sh
²少なくとも呼び出されたときに標準言語にある程度準拠するインタプリタ実装は、標準が動作を指定しないsh
領域(たとえば、ここ)で言語拡張をサポートすることを妨げません。
答え2
#!/bin/sh
command="somecommand"
if [ "$(which "$command")" != "" ];
then
echo "command found"
else
echo "command not found"
fi