Как заключить в кавычки строки в именах файлов в 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
Другие вопросы по тегам