Вы должны использовать "${@}"
вместо ${@}
(, как с echo "${@}"
), но это не является причиной вашей проблемы.
Причина в том, что перенаправление происходит очень рано при синтаксическом анализе командной строки, до подстановки параметров. Таким образом, после того, как переменная поместила >
в командную строку, оболочка больше не ищет >
.
Важный момент, который я заметил после того, как опубликовал свой ответ :С позывным типа
run mysqldump blabla > dump.sql
функция run
не видит >
и dump.sql
. Это, вероятно, не то, что вам нужно, потому что это не позволяет вам изменить все перенаправления с помощью одной переменной среды, поскольку вывод echo "${@}"
также перенаправляется в файл. Таким образом, вы должны использовать что-то вроде run --redirect dump.sql mysqldump blabla
, см. ниже.
Есть две возможности:
Придерживайтесь "$@"
и используйте eval
. Конечно, это может привести вас к кошмару цитирования. Вы должны заключать в кавычки все, кроме >
, чтобы оболочка увидела пустой >
в командной строке, прежде чем удалить кавычки.
Обработка перенаправления отдельно:
run --redirect dump.sql mysqldump blabla
run() {
if [ "$1" == '--redirect' ]; then
shift
redirect_target="$1"
shift
else
redirect_target='/dev/stdout' # works at least with Linux
fi
if [[ "$(printenv DRY_RUN)" = "yes" ]]
then
echo "${@}"
else
"${@}" > "$redirect_target"
fi
}
Вы можете избежать redirect_target='/dev/stdout'
, если поместите if [ "$1" == '--redirect' ]
в ветку else
if [[ "$(printenv DRY_RUN)" = "yes" ]]
.
if [[ "$(printenv DRY_RUN)" = "yes" ]]
then
if [ "$1" == '--redirect' ]; then
# do not output "--redirect file"
shift
shift
fi
echo "${@}"
else
if [ "$1" == '--redirect' ]; then
shift
redirect_target="$1"
shift
"${@}" > "$redirect_target"
else
"${@}"
fi
fi
Оказалось, что добавление флага -usepw
позволило мне получить доступ к рабочему столу Xfce.