stderrの特定のエラーリダイレクト

stderrの特定のエラーリダイレクト

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「対応するファイルまたはディレクトリなし」エラーを防ぎます。

また、生成されたエラーメッセージは誤解を招く可能性があります。ファイルをインポートしても、サブシェルはもちろん何も「生成」されません。

おすすめ記事