質問

例:

#!/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* あなたはおそらくまだ処分したいのですが、 r 0または1のいずれかになり、出力は含まれません。

ラインまたはブロック全体からのリダイレクト出力の他の例は良いものであり、他の人が示唆したように、条件をテストする他の方法を知る必要があります(しかし、私は ls 任意の例でした)

他のヒント

使用する必要はありません ls 最初のファイルを確認します a. 。シェルを使用するだけです

a() {
  shopt -s nullglob
  ret="f"
  for file in a*
  do   
    ret="t"
    break
  done
  echo "$ret"
}

コマンドのリストにリダイレクトを置くことができます。

{
  command1
  command2
} >/dev/null

スクリプトのある時点で、後続のコマンドから出力が必要ない場合は、シェルの出力を次のようにリダイレクトできます。 exec ビルトイン:

echo interesting
exec >/dev/null
echo boring

これは、関数の終了だけでなく、スクリプトの終了まで続くことに注意してください。これは、興味深いコマンドの後ではなく、コマンドの世話をします。

の効果を元に戻す方法があります exec /dev/null, 、ファイル記述子の操作を使用します。実際に運動するのが難しいかもしれないので、私は必ずしもそれをお勧めしません。アイデアは、標準出力に接続されているものを別の記述子に再配置し、標準出力を別のファイルにリダイレクトし、最終的に元の標準出力を標準出力に戻すことです。

{
  exec 3>&1         # duplicate fd 3 to fd 1 (standard output)
  exec >/dev/null   # connect standard output to /dev/null
  echo boring
  exec 1>&3         # connect standard output back to what was saved in fd 3
  echo interesting
  exec >/dev/null   # connect standard output to /dev/null again
  echo more boring
} 3>/dev/null       # The braced list must have its fd 3 connected somewhere,
                    # even though nothing will actually be written to it.
a() { 
ls -1 a*  > /dev/null
[ "$?" == "0" ] && echo t  || echo f

} 

r=`a` 
echo $r 

-f Filename]およびその他のファイルテストを使用することを検討してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top