Warum ist der Befehl md5sum <<< 'ddd'
(output:) d6d88f2e50080b9602da53dac1102762 -
richtig und md5sum << 'ddd'
nicht?
Was heißt <<<
das?
Warum ist der Befehl md5sum <<< 'ddd'
(output:) d6d88f2e50080b9602da53dac1102762 -
richtig und md5sum << 'ddd'
nicht?
Was heißt <<<
das?
Antworten:
Das <<<
startet einen "Hier-String": Der String wird erweitert und dem stdin des Programms zugeführt. (In Ihrem Fall findet nicht viel Expansion statt.) Dies entspricht:
echo ddd | md5sum
Zum anderen <<
startet hier ein Dokument. Alle folgenden Zeilen bis zu einer, die den Marker enthält ddd
, umfassen die Eingabe des Programms. (Sie sollten einen Marker verwenden, der wahrscheinlich nicht in Ihren Daten enthalten ist.) Sie können den gleichen Effekt wie oben erzielen:
md5sum <<END
ddd
END
Es gibt einen Unterschied zwischen <<END
und <<'END'
: Ohne die Anführungszeichen werden alle Variablen, Escape-Sequenzen usw. im vorliegenden Dokument wie gewohnt erweitert.
<<<
Führt eine Here-Zeichenfolge ein : Die Zeichenfolge danach <<<
wird als Eingabe an den Befehl übergeben. Dieser stammt aus Byron Rakitzis 'Port von rc
(einer Plan 9-Shell) zu Unix und ist auch in zsh, ksh93 und bash vorhanden.
<<
Führt ein here-Dokument ein : Nachfolgende Zeilen des Shell-Skripts werden als Eingabe an den Befehl übergeben, und die Zeichenfolge after <<
ist ein Abschlusszeichen. Hier funktionieren Dokumente in allen Bourne-Shells (Bourne, POSIX, ash, bash, ksh, zsh,…), C-Shells (csh, tcsh) und Plan 9-Shells (rc, es).
<<<
ist keine ksh
Erweiterung, der Pfad ist rc
-> zsh
-> ksh93
-> bash
( ksh
Versionshinweise bestätigen das einmalige Ausleihen des Features von zsh
). <<
funktioniert auch in rc
Stil Muscheln
rc
und zsh
<<<
obwohl darin rc
kein abschließendes Zeilenumbruchzeichen und keine temporäre Datei enthalten ist (verwendet eine Pipe und einen zusätzlichen Prozess, der sie zumindest im Port an Linux weiterleitet).
<<<
aus dem Unix - Port kommt von rc
da es sieht nicht aus wie die Plan9 rc
es hat.
rc
,<<<
(wie<<
) eine temporäre Datei verwendet , kann so durch Befehle , die verwendet werden ,lseek
deren stdin.