if
だからいくつかの機能を取得するステートメントを使用してスクリプトを実行したいと思います。
$ cat functions.sh
#!/bin/bash
sampleFunction(){
if [[ ! "${fakeVariable}" == '2' ]]
then
read -n1 -r -p "Error! Press any key to continue ..."
fi
}
sampleFunction
echo "Well, hi!"
私が実行したとき:
if ! 2>/dev/null . "${HOME}"'/functions.sh'
then
echo "${HOME}"'/functions.sh could not be spawned. Terminating ...'
fi
コンソールは出力しませんが、Error! Press any key to continue ...
そこに座って私がキーを押すのを待っています。そうすれば、Well, hi
何が印刷されるのかがわかります。
functions.sh
欠落している場合は、$HOME
次のように印刷されます。
/Users/leetbacoon/functions.sh could not be spawned. Terminating ...
そうする必要があります。
私がそれを取り出して2>/dev/null
存在するfunctions.sh
場合、私はError! Press any key to continue ...
それを元に印刷し、Well, hi!
キーを押した後に追跡します。
もし2>/dev/null
そうなら、取り出したらfunctions.sh
失われた、私は得る:
-bash: /Users/leetbacoon/functions.sh: No such file or directory
/Users/leetbacoon/functions.sh could not be spawned. Terminating ...
基本的に私が望むのはこれです。
$ ### functions.sh exists
$ if ! 2>/dev/null . "${HOME}"'/functions.sh' ; then echo "${HOME}"'/functions.sh could not be spawned. Terminating ...' ; fi
Error! Press any key to continue ...
Well, hi!
$ ###
$ ### functions.sh doesn't exist
$ if ! 2>/dev/null . "${HOME}"'/functions.sh' ; then echo "${HOME}"'/functions.sh could not be spawned. Terminating ...' ; fi
/Users/leetbacoon/functions.sh could not be spawned. Terminating ...
オペレーティングシステムはmacOS High Sierra 10.13.6で、bashバージョンは3.2.57(1)リリースです。
答え1
プロンプトと診断メッセージは常に標準エラーストリームから生成されます。これは、一般出力のリダイレクトの可能性を妨げないためです。$PS1
ところが、シェルのメインプロンプト( )も同様である。
これはread -p
、出力プロンプトが次のようになることを意味します。返品標準エラーストリームに書き込み、そのストリームにリダイレクトするため、プロンプト/dev/null
メッセージは表示されません。
/Users/leetbacoon/functions.sh
それを取得する前に、それが存在するかどうかをテストすることをお勧めします。
if [ -f "$HOME/functions.sh" ]; then
. "$HOME/functions.sh"
else
printf '%s is missing...\n' "$HOME/functions.sh" >&2
done
~/.bash_profile
これは時々呼び出される方法を模倣し、~/.bashrc
「対応するファイルまたはディレクトリなし」エラーを防ぎます。
また、生成されたエラーメッセージは誤解を招く可能性があります。ファイルをインポートしても、サブシェルはもちろん何も「生成」されません。
答え2
このread
コマンドはプロンプトを印刷するために使用されますstderr
。またはあなたはする必要があります
2> /dev/null
スクリプトを呼び出すときは使用しないでください。- stdoutを使用してプロンプトを印刷するには、コマンドの
2>&1
最後に以下を追加します。read
read -n1 -r -p "Error! Press any key to continue ..." 2>&1