例:
#!/bin/sh
a() {
R=f
ls -1 a*
[ "$?" == "1" ] && { R=t; }
echo $R
}
r=`a`
echo $r
$rコマンドの出力が含まれていtますfが、出力も含まれていますls。
私は書くかもしれませんがls -1 a* >/dev/null 2>/dev/null、エラーにつながる可能性のあるより複雑なスクリプトがある場合。
から単一の値を返す方法はありますa()か?
例:
#!/bin/sh
a() {
R=f
ls -1 a*
[ "$?" == "1" ] && { R=t; }
echo $R
}
r=`a`
echo $r
$rコマンドの出力が含まれていtますfが、出力も含まれていますls。
私は書くかもしれませんがls -1 a* >/dev/null 2>/dev/null、エラーにつながる可能性のあるより複雑なスクリプトがある場合。
から単一の値を返す方法はありますa()か?
シェル関数は数値を返すことができます。'f'と't'ではなく0と1を考慮してください
#!/bin/sh
a() {
R=0
ls -1 a*
[ "$?" == "1" ] && { R=1; }
return $R
}
a
r=$?
echo $r
ls -1 a*これにより、おそらくまだ破棄したいからの出力が書き込まれますが、の値はr0または1のいずれかになり、出力は含まれません。
行またはブロック全体からの出力をリダイレクトする他の例は優れており、他の人が示唆しているように、条件をテストする他の方法を知る必要があります(ただし、これlsは一種の任意の例であると想定していました)
lsで始まるファイルをチェックするために使用する必要はありませんa。シェルをそのまま使う
a() {
shopt -s nullglob
ret="f"
for file in a*
do
ret="t"
break
done
echo "$ret"
}
コマンドのリストにリダイレクトを追加できます。
{
コマンド1
コマンド2
} >/開発/null
スクリプトのある時点で、後続のコマンドからの出力が必要ない場合は、シェルの出力をexecビルトインでリダイレクトできます。
エコー興味深い exec >/dev/null 退屈なエコー
これは、関数の最後までではなく、スクリプトの最後まで続くことに注意してください。これは、興味深いコマンドの後のコマンドを処理しますが、前のコマンドは処理しません。
exec /dev/nullファイル記述子の操作を使用して、 の効果を元に戻す方法があります。ただし、実際に実行するのは難しい場合があるため、必ずしもお勧めしません。アイデアは、標準出力に接続されているものを別の記述子に再配置し、次に標準出力を別のファイルにリダイレクトし、最後に元の標準出力を標準出力に再配置することです。
{
exec 3>&1 # fd 3 を fd 1 に複製 (標準出力)
exec >/dev/null # 標準出力を /dev/null に接続
退屈なエコー
exec 1>&3 # 標準出力を fd 3 に保存されたものに接続します
エコー興味深い
exec >/dev/null # 標準出力を /dev/null に再度接続
より退屈なエコー
} 3>/dev/null # ブレース付きリストには fd 3 がどこかに接続されている必要があります。
# 実際には何も書き込まれませんが。
a() {
ls -1 a* > /dev/null
[ "$?" == "0" ] && echo t || echo f
}
r=`a`
echo $r
[-ffilename]やその他のファイルテストの使用も検討してください。