コマンドが存在することを確認してください。

コマンドが存在することを確認してください。

からインスピレーションを受けるこの回答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

-ptypeこのコマンドの標準オプションではありません。type標準にもかかわらず、ユーティリティ自体はPOSIXではオプションです(UNIX準拠の認証を取得するために必要ですが、XSIを実装するシステムにのみ必要です)。

typecommand -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などの外部コマンドの場合にのみパスを印刷します。では、次のように動作します。bashmkshksh93busybox ashzshyashmkshyash$PATHgetconf PATHzsh$PATHksh93bash-pathtype -pbusybox ashcommand -v

sh²少なくとも呼び出されたときに標準言語にある程度準拠するインタプリタ実装は、標準が動作を指定しないsh領域(たとえば、ここ)で言語拡張をサポートすることを妨げません。

おすすめ記事