Возвратите единственное значение от функции сценария оболочки

Пример:

#!/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() ?

5
задан Gilles 'SO- stop being evil' 10 August 2012 в 11:43
поделиться

4 ответа

Функция оболочки может возвращать числовое значение. Считайте 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 был своего рода произвольным примером)

4
ответ дан 14 December 2019 в 13:26
поделиться

вам не нужно использовать ls для проверки файлов, начинающихся с a . Просто используйте оболочку

a() {
  shopt -s nullglob
  ret="f"
  for file in a*
  do   
    ret="t"
    break
  done
  echo "$ret"
}
1
ответ дан 14 December 2019 в 13:26
поделиться

Вы можете поместить перенаправление в список команд:

{
  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.
1
ответ дан 14 December 2019 в 13:26
поделиться
a() { 
ls -1 a*  > /dev/null
[ "$?" == "0" ] && echo t  || echo f

} 

r=`a` 
echo $r 

Рассмотрите возможность использования [-f filename] и других файловых тестов.

0
ответ дан 14 December 2019 в 13:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: