Переключите перенаправление Bash с переменной

MUTE='&> /dev/null'
echo "text" $MUTE

Существует ли способ сделать ту работу, сохраняющую перенаправление в переменной?

4
задан 16 March 2016 в 02:25

4 ответа

По моему скромному мнению, это было бы более изящно для использования присутствия / значение переменной для условного закрытия дескрипторов файлов, например,

$ cat myscript.sh
#!/bin/bash

if [ -n "$MUTE" ]; then
    exec &>-
fi

echo somestuff
echo someerr >&2

затем

$ ./myscript.sh
somestuff
someerr

, но

$ MUTE=yes ./myscript.sh
$
<час>

, Если Вы действительно хотите к переключатель перенаправление, Вы могли бы рассмотреть создание функции оболочки, которая копирует дескриптор (дескрипторы) файла прежде, чем закрыть их и затем восстанавливает дубликаты, чтобы повторно включить исходные потоки, например,

#!/bin/bash

function mute {
  case "$1" in
    "on") 
      exec 3>&1-
      exec 4>&2-
    ;;
    "off") 
      exec 1>&3-
      exec 2>&4-
    ;;
    *)
  esac
}


# Demonstration: 

echo "with mute on: "
mute on
ls somefile
ls nofile

mute off
echo "with mute off: "
ls somefile
ls nofile

Результат:

$ ./mute.sh
with mute on: 
with mute off: 
somefile
ls: cannot access nofile: No such file or directory
4
ответ дан 1 December 2019 в 08:59

От Справочник Bash: Простое Расширение Команды :

  1. слова, которые синтаксический анализатор отметил как переменные присвоения (те, которые предшествуют названию команды) и перенаправления, сохраняются для дальнейшей обработки.
  2. слова, которые не являются переменными присвоениями или перенаправлениями, расширены (см. Расширения Shell). Если какие-либо слова остаются после расширения первое слово взято, чтобы быть названием команды, и остающиеся слова являются аргументами.
  3. Перенаправления выполняются, как описано выше (см. Перенаправления).

Это означает, что синтаксический анализатор команды сначала определяет все перенаправления, затем выполняет различные расширения и наконец решает перенаправления, которые он ранее определил : они не включают возможные перенаправления, следующие из расширений.

Однако от help eval:

Execute arguments as a shell command.

    Combine ARGs into a single string, use the result as input to the shell,
    and execute the resulting commands.

Настолько использующий eval Вы могли создать своего рода уровень абстракции, который позволит команде быть обработанной дважды:

MUTE='&> /dev/null'
eval echo "text" $MUTE
$ MUTE='&> file'
$ eval echo "text" $MUTE
$ cat file
text
3
ответ дан 1 December 2019 в 08:59

Это прокладывает себе путь, я не знаю, применимо ли это для Вашего подхода:

MUTE='&> /dev/null'
bash -c "echo \"text\" $MUTE"
1
ответ дан 1 December 2019 в 08:59

Можно было использовать функцию, которая пишет stdin к тому везде, где Вы хотите это.

$> MUTE(){  cat /dev/stdin > testFile.txt  ; }                                                    
$> df | MUTE                                                                                      
$> cat testFile.txt
Filesystem     1K-blocks     Used Available Use% Mounted on
udev             1954208        4   1954204   1% /dev
tmpfs             393160     3548    389612   1% /run
/dev/sda1      115247656 95511252  13859056  88% /
none                   4        0         4   0% /sys/fs/cgroup
none                5120        0      5120   0% /run/lock
none             1965792      872   1964920   1% /run/shm
none              102400      128    102272   1% /run/user
cgmfs                100        0       100   0% /run/cgmanager/fs

Или мы могли сказать функции выполняться независимо от того, что мы хотим с перенаправлением

$> MUTE(){  "$@" > testFile.txt  ; }                                                              
$> MUTE lsblk                                                                                     
$> cat testFile.txt                                                                               
NAME                             MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                                8:0    0 111.8G  0 disk 
└─sda1                             8:1    0 111.8G  0 part /

Нестандартный путем, хакерство, но это вид работ :)

2
ответ дан 1 December 2019 в 08:59

Другие вопросы по тегам:

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