/ / Wie ziehe ich Zeichenfolgen in Dateinamen in zsh (zurück zu anderen Skripten) - zsh

Wie ziehe ich Zeichenketten in Dateinamen in zsh (zurück zu anderen Skripten) - zsh

Ich habe ein Skript, das eine Zeichenfolge in einem Dateinamen wie folgt hat:

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 ist definiert als:

test_expect_success () {
echo "expecting success: $1"
eval "$2"
}

und run ist definiert als:

#!/bin/zsh
# make nice filename removing special characters, replace space with _
filename=`echo [email protected] | tr " " _ | tr -cd "a-zA-Z0-9_."`.run
echo "#!/bin/zsh" > $filename
print "[email protected]" >> $filename
chmod +x $filename
./$filename

Aber wenn ich das Toplevel-Skript ausführe test_expect_success... Ich bekomme cat_a_file_with_spaces.run mit:

#!/bin/zsh
cat a file with spaces

Das Problem sind die Anführungszeichen a file with spaces im cat_a_file_with_spaces.run wird vermisst. Wie erhalten Sie die Z-Shell, um das korrekte Angebot zu halten?

Vielen Dank

Antworten:

4 für die Antwort № 1

Versuchen

run cat ${(q)filename_with_spaces}

. Es ist, wofür (q) Modifier geschrieben wurde. Gleiches für das Laufskript:

echo -E ${(q)@} >> $filename

. Und es ist nicht Bash, du musst keine Anführungszeichen um Variablen setzen: außer du spezifizierst eine Option (erinnere dich nicht genau)

command $var

leitet immer genau ein Argument an command egal, was drin ist $var. Um sicherzustellen, dass einige zsh-Optionen das Verhalten nicht ändern, setzen Sie

emulate -L zsh

ganz oben in jedem Skript.

Beachten Sie, dass die ursprüngliche Variante (run cat "$filename_with_spaces") ist nicht eine korrekte Quotierung: Der Dateiname darf ein beliebiges Zeichen außer NULL und enthalten / Wird zum Trennen von Verzeichnissen verwendet. ${(q)} kümmert sich darum.

Aktualisieren: Ich hätte die Funktion test_expect_success folgendermaßen geschrieben:

function test_expect_success()
{
emulate -L zsh
echo "Expecting success: $1" ; shift
[email protected]
}

Verwendung:

test_expect_success "Message" run cat $filename_with_spaces