Мой сценарий:
#!/bin/bash
generic()
{
echo $1;
$1 > temp.txt 2>&1
}
generic "echo asd > /dev/null 2>&1; echo temp"
Ожидаемый результат:
- "asd" должен идти в / dev / null
- "temp" должен войти в файл temp.txt.
Фактический результат:
- "asd> / dev / null 2> & 1; echo temp" переходит в файл temp.txt.
Почему запускается только первый оператор echo, а его вывод перенаправляется на temp.txt. Кроме того, почему вторая команда обрабатывается как строка?
1 ответ
Вам необходимо прочитать spec.
(Это спецификация POSIX sh, потому что у bash нет настоящей спецификации. Bash пытается быть совместимым с POSIX sh, но добавляет кучу ненужных сложностей. Вместо этого вы должны использовать #!/bin/sh
как новичок и всякий раз, когда вы хотите напишите вменяемый сценарий)
В частности, вы не можете хранить в переменной ничего, кроме одной команды. Если вы выполняете из переменной, как если бы вы произносили $1
, то это интерпретируется как одна команда:
Разбиение происходит по пробелу или чему-то еще внутри переменной IFS
. В вашем примере это приведет к следующему списку токенов:
- эхо
- ASD
- >
- / dev / null
- 2> & 1;
- эхо
- темп
Этот список затем выполняется как процесс, эквивалентный записи в C execlp("echo", "echo", "asd", ">", "/dev/null", "2>&1;", "echo", "temp", NULL);
.
Обратите внимание, что если бы вы вместо этого написали "$1"
, это привело бы к тому, что оболочка попыталась запустить программу с именем echo asd > /dev/null 2>&1; echo temp
без аргументов.
Если вместо этого вы хотите переоценить строку как командную строку оболочки, вам нужно использовать eval
: eval "$1"
. Но помните о последствиях для безопасности! Многие считают Эвал злом.
Похожие вопросы
Новые вопросы
bash
Этот тег предназначен для вопросов о сценариях, написанных для командной оболочки Bash. Сценарии оболочки с синтаксисом или другими ошибками, пожалуйста, проверьте их на https://shellcheck.net, прежде чем публиковать здесь. Вопросы об интерактивном использовании Bash, скорее всего, будут актуальны на Unix & Linux Stack Exchange или Super User, чем на Stack Overflow.