Пример:
#!/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()
?
Функция оболочки может возвращать числовое значение. Считайте 0 и 1, а не 'f' и 't'
#!/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
builtin:
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] и других файловых тестов.