Ich habe eine browserbasierte Shell / ein browserbasiertes Terminal, das Bash-Befehle ausführt, und ich entkomme Leerzeichen, aber es stellt sich heraus, dass auch Klammern maskiert werden müssen. Welche anderen Zeichen müssen für Dateinamen, die nicht in Anführungszeichen stehen, maskiert werden?
12
mv filename filename-foo
in Bash. Welche Zeichen muss ich außer Leerzeichen und Klammern entkommen?mv "$filename" "$newname"
.Antworten:
Die einfache Lösung besteht darin, ein einfaches Anführungszeichen (
'
) am Anfang und ein weiteres einfaches Anführungszeichen am Ende einzufügen und jedes'
Zeichen im Dateinamen durch die 4-stellige Sequenz zu ersetzen'\''
. Alle Zeichen verlieren ihre besondere Bedeutung innerhalb einer Zeichenfolge in einfachen Anführungszeichen, mit Ausnahme von sich'
selbst, das das Ende der Zeichenfolge markiert. Die Sequenz'\''
beendet das Literal in einfachen Anführungszeichen, unmittelbar gefolgt von einem einfachen Anführungszeichen in Anführungszeichen und öffnet ein neues Literal in einfachen Anführungszeichen. Also der Dateinamekann wie folgt zitiert werden:
Doppelte Anführungszeichen haben komplexere Escape-Regeln und erlauben Ihnen nicht, ein Ausrufezeichen einzufügen,
!
wenn die Verlaufssubstitution aktiviert ist. Daher werde ich sie nicht weiter betrachten.Ein alternativer Ansatz besteht darin, Zeichen mit Backslashes zu schützen. Dies funktioniert für alle Zeichen außer Zeilenumbrüchen. Für eine neue Zeile ist es die einzige Lösung, sie in einfache Anführungszeichen (oder doppelte Anführungszeichen) zu setzen. Wenn Sie die Anzahl der Backslashes minimieren möchten, um dem Benutzer den angegebenen Namen anzuzeigen, können Sie ihn auf Stellen beschränken, an denen der Backslash benötigt wird. Je mehr Backslashes Sie jedoch weglassen, desto mehr riskieren Sie, einen zu vergessen, der benötigt wird. Buchstaben, Ziffern und Nicht-ASCII-Zeichen sind immer in Ordnung¹. Zitieren Sie Leerzeichen und Interpunktion, wenn Sie sich nicht sicher sind.
Bei einer typischen Shell (ksh, bash oder zsh) müssen Sie zumindest unter bestimmten Umständen die folgenden Zeichen zitieren.
!
- Erweiterung der Geschichte."
- Shell-Syntax.#
- Kommentarstart, wenn Leerzeichen vorangestellt sind; zsh Wildcards.$
- Shell-Syntax.&
- Shell-Syntax.'
- Shell-Syntax.(
- sogar mitten in einem Wort: ksh Extended Globs (auch in Bash und Zsh erhältlich); zsh Wildcards.)
(siehe(
)*
- sh Wildcard.,
- nur innerhalb der Klammererweiterung.;
- Shell-Syntax.<
- Shell-Syntax.=
- in zsh, wenn es am Anfang eines Dateinamens steht (Dateinamenerweiterung mit PATH-Suche).>
- Shell-Syntax.?
- sh Wildcard.[
- sh Wildcard.\
- Shell-Syntax.]
- Sie können davonkommen, wenn Sie es nicht zitieren.^
- Erweiterung der Geschichte; zsh Wildcard.`
- Shell-Syntax.{
- Klammererweiterung.|
- Shell-Syntax.}
- muss in zsh entkommen, andere Schalen sind milder, wenn es keine passende Öffnungsstrebe gibt.~
- Erweiterung des Home-Verzeichnisses am Anfang eines Dateinamens; zsh Wildcard; Immer sicher, wenn es das letzte Zeichen ist.Einige weitere Zeichen können manchmal eine besondere Behandlung erfordern:
-
ist nicht speziell für die Shell, aber wenn es am Anfang eines Befehlsarguments steht, zeigt es eine Option an. Es kann nicht mit Anführungszeichen geschützt werden, da sich die spezielle Behandlung im Befehl und nicht in der Shell befindet. Um einen Dateinamen zu schützen, der mit beginnt-
, können Sie ihn vorlegen./
- auf diese Weise ist es immer noch dieselbe Datei, aber das Argument beginnt nicht mit-
mehr mit..
ist an sich nichts Besonderes, aber*
Punktdateien sind standardmäßig von Globs ausgeschlossen .:
ist nicht speziell für die Shell, aber einige Befehle analysieren sie speziell, z. B. um eine entfernte Datei (hostname:filename
) anzugeben . In der Dokumentation des Befehls finden Sie Informationen zum Umgang mit Dateinamen, die Doppelpunkte enthalten.¹ Es sei denn, der Benutzer hat alternative Verlaufserweiterungszeichen konfiguriert. Einige Muscheln erlauben dies. Dies ist ein weiterer Grund, einfache Anführungszeichen anstelle von Backslashes zu verwenden.
quelle
LF
nur Zeilenumbrüche können in einigen Shells mit einem Backslash zitiert werden.