私はプログラミング中です。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
figlet
Figletがインストールされていなくてもパラメータを印刷するには、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() { :; }
type
figlet
シェル組み込み、エイリアス、またはキーワードとして存在することを確認し、>/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
たとえば、私が呼び出す特定のコマンドの出力に基づいてファイルを削除できる他の人のための複雑なスクリプトを作成した場合、誤ってそのファイルからファイルを削除したり、そうでない可能性がある項目を選択したくありません。期待した。