Как заключить в кавычки строки в именах файлов в zsh (переход к другим сценариям)
У меня есть скрипт, который имеет строку в имени файла, например, так:
filename_with_spaces="a file with spaces"
echo test > "$filename_with_spaces"
test_expect_success "test1: filename with spaces" "
run cat \"$filename_with_spaces\"
run grep test \"$filename_with_spaces\"
"
test_expect_success
определяется как:
test_expect_success () {
echo "expecting success: $1"
eval "$2"
}
а также run
определяется как:
#!/bin/zsh
# make nice filename removing special characters, replace space with _
filename=`echo $@ | tr ' ' _ | tr -cd 'a-zA-Z0-9_.'`.run
echo "#!/bin/zsh" > $filename
print "$@" >> $filename
chmod +x $filename
./$filename
Но когда я запускаю скрипт верхнего уровня test_expect_success
... Я получил cat_a_file_with_spaces.run
с:
#!/bin/zsh
cat a file with spaces
Проблема в кавычках a file with spaces
в cat_a_file_with_spaces.run
пропал, отсутствует. Как вы получаете Z shell, чтобы сохранить правильное цитирование?
Спасибо
1 ответ
Пытаться
run cat ${(q)filename_with_spaces}
, Это то, для чего был написан модификатор (q). То же самое для сценария запуска:
echo -E ${(q)@} >> $filename
, И это не bash, вам не нужно заключать в кавычки переменные: если вы не укажете какую-либо опцию (не помню какую именно)
command $var
всегда передает ровно один аргумент command
независимо от того, что в $var
, Чтобы убедиться, что некоторые опции zsh не изменят поведение, установите
emulate -L zsh
в верхней части каждого сценария.
Обратите внимание, что первоначальный вариант (run cat \"$filename_with_spaces\"
) не является правильным цитированием: имя файла может содержать любой символ, кроме NULL и /
используется для разделения каталогов. ${(q)}
заботится об этом.
Обновление: я написал бы функцию test_expect_success следующим образом:
function test_expect_success()
{
emulate -L zsh
echo "Expecting success: $1" ; shift
$@
}
Использование:
test_expect_success "Message" run cat $filename_with_spaces