MUTE='&> /dev/null'
echo "text" $MUTE
Существует ли способ сделать ту работу, сохраняющую перенаправление в переменной?
По моему скромному мнению, это было бы более изящно для использования присутствия / значение переменной для условного закрытия дескрипторов файлов, например,
$ 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
От Справочник Bash: Простое Расширение Команды :
- слова, которые синтаксический анализатор отметил как переменные присвоения (те, которые предшествуют названию команды) и перенаправления, сохраняются для дальнейшей обработки.
- слова, которые не являются переменными присвоениями или перенаправлениями, расширены (см. Расширения Shell). Если какие-либо слова остаются после расширения первое слово взято, чтобы быть названием команды, и остающиеся слова являются аргументами.
- Перенаправления выполняются, как описано выше (см. Перенаправления).
Это означает, что синтаксический анализатор команды сначала определяет все перенаправления, затем выполняет различные расширения и наконец решает перенаправления, которые он ранее определил : они не включают возможные перенаправления, следующие из расширений.
Однако от 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
Это прокладывает себе путь, я не знаю, применимо ли это для Вашего подхода:
MUTE='&> /dev/null'
bash -c "echo \"text\" $MUTE"
Можно было использовать функцию, которая пишет 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 /
Нестандартный путем, хакерство, но это вид работ :)