Linuxシェルスクリプト:存在する場合にのみプログラムを実行し、存在しない場合は無視します。

Linuxシェルスクリプト:存在する場合にのみプログラムを実行し、存在しない場合は無視します。

私はプログラミング中です。Linuxシェルスクリプトfiglet正しいツール(例:インストール済み(これはシステムからアクセスできます。)。

例:

#!/usr/bin/env bash
echo "foo"
figlet "Starting"
echo "moo"
figlet "Working"
echo "foo moo"
figlet "Finished"

私のスクリプトを実行したいです。エラーなしfigletそんなときでもインストールされていません

何ができるだろうか?実用的な方法

答え1

私の説明は、その関数内でツールと同じ名前のラッパー関数を使用し、実際のツール(存在する場合)を実行することです。

figlet() {
  if command -p figlet  >/dev/null 2>&1
    then 
      command figlet "$@"
    else
      :
    fi
}

これにより、figlet arg1 arg2...スクリプトが変更されていないままになる可能性があります。

@Olorinはより簡単なアプローチを提案しました。必要なときにのみラッパー関数を定義します(ツールが存在しない場合)。

if ! command -v figlet > /dev/null; then figlet() { :; }; fi

figletFigletがインストールされていなくてもパラメータを印刷するには、Olorinの提案を次のように調整します。

if ! command -v figlet > /dev/null; then figlet() { printf '%s\n' "$*"; }; fi

答え2

figlet存在するかどうかをテストできます。

if type figlet >/dev/null 2>&1
then
    echo Figlet is installed
fi

答え3

スクリプトの先頭にfiglet存在することを確認し、存在しない場合は何もしないシェル関数を定義します。

type figlet >/dev/null 2>&1 || figlet() { :; }

typefigletシェル組み込み、エイリアス、またはキーワードとして存在することを確認し、>/dev/null 2>&1出力を取得しないようにstdinとstdoutを削除し、存在しない場合は何もしない関数を定義figlet() { :; }します。figlet

figletこれにより、使用するスクリプトのすべての行を編集またはfiglet呼び出すたびにスクリプトが存在することを確認する必要がなくなります。

必要に応じて診断メッセージを追加できます。

type figlet >/dev/null 2>&1 || { echo 'figlet not installed.' ; figlet() { :; } ; }

ボーナスとしてどのシェルを使っているのか言及していないので、これはPOSIX互換だと思うので、ほとんどのシェルで動作します。

答え4

別のオプション - プロジェクトの自動構成スクリプトから見たパターン。

if [ -x /usr/bin/figlet ]
then
    FIGLET=/usr/bin/figlet
else
    FIGLET=:
fi

$FIGLET "Hello, world!"

状況によってはこのようにしても良いです。

if [ -x /usr/bin/figlet ]
then
   SAY=/usr/bin/figlet
elif [ -x /usr/local/bin/figlet ]
then
   SAY=/usr/local/bin/figlet
elif [ -x /usr/bin/banner ]
then
   SAY=/usr/bin/banner
else
   SAY=/usr/bin/echo
fi

$SAY "Hello, world!"

正確なパスがわからない場合は、既知のelif場所を試すか、常に確認コマンドを使用することがPATHできます(上記を参照)。

if command -v figlet >/dev/null
then
    SAY=figlet
elif command -v banner >/dev/null
then
    SAY=banner
else
    SAY=echo
fi

通常、スクリプトを作成するときに私が指定した特定の場所でのみコマンドを呼び出すことを好みます。私はエンドユーザーが自分のPATH(そしておそらく自分の)ものに何を入れるのかわからない不確実性/危険が好きではありません~/bin

~/binたとえば、私が呼び出す特定のコマンドの出力に基づいてファイルを削除できる他の人のための複雑なスクリプトを作成した場合、誤ってそのファイルからファイルを削除したり、そうでない可能性がある項目を選択したくありません。期待した。

関連情報