Kann die Shell-Erweiterung ausgedruckt werden?

2701
Weishi Zeng

Ich weiß, es gibt einen bestimmten Satz von Regeln, die die vom Benutzer eingegebenen Befehle durch die Shell erweitern. (lass uns über die Bash-Shell sprechen.)

Kann man nach der Shell-Erweiterung einen Befehl im Formular ausdrucken? Es scheint ein gutes Hilfsmittel zu sein, um zu lernen und sicherzustellen, wie Shell Sonderzeichen erweitert.

z.B

$ echo *   

Ich möchte den erweiterten Befehl ausdrucken, der folgende Zeile ist:

echo 
15

4 Antworten auf die Frage

12
John1024

Sie können verwenden set -x.

Betrachten Sie zum Beispiel das Skript:

$ cat script.sh set -x echo * 

Bei der Ausführung wird die erweiterte echoAnweisung angezeigt, bevor sie tatsächlich ausgeführt wird:

$ bash script.sh + echo file1 file2 file3 script.sh file1 file2 file3 script.sh 

Und, wie Kundor betont, funktioniert dies auch interaktiv auf der Kommandozeile:

$ set -x + set -x $ echo * + echo file1 file2 file3 script.sh file1 file2 file3 script.sh 

Dokumentation

man basherklärt, was set -xwie folgt funktioniert:

Zeigen Sie nach dem Erweitern jedes einfachen Befehls für Befehl, Fallbefehl, Auswahlbefehl oder Arithmetik für Befehl den erweiterten Wert von PS4 an, gefolgt vom Befehl und seinen erweiterten Argumenten oder der zugehörigen Wortliste.

Der Standardwert für PS4ist, wie oben gezeigt, ein Pluszeichen, gefolgt von einem Leerzeichen.

Und es funktioniert auch in einer interaktiven Shell (nach der ich denke, dass das OP sucht.) Kundor vor 9 Jahren 2
10
BenjiWiebe

Verwenden echoSie einfach ... setzen Sie es vor den Befehl, den Sie erweitern möchten. Ich benutze das ziemlich oft.

$ ls one.txt two.txt three.dat $ echo rm *.txt rm one.txt two.txt $ rm *.txt 

Sie können Homeund verwenden Del, um das Vorhergehende schnell hinzuzufügen oder zu entfernen echo.

EDIT
Wie wies darauf hin, in den Kommentaren, das wird nicht funktionieren, wenn der Befehl nicht nur ein einfacher Befehl ist (wie wenn es sich um eine forSchleife, verwendet das Rohr |oder &&oder irgendetwas anderes ähnlich).

Das mache ich beim Testen eines Skripts Barmar vor 9 Jahren 1
Dies ist immer noch von anderen Shell-Token `echo cat * | betroffen Manche Programme tun nicht, was Sie von dieser Antwort erwarten. Kroltan vor 9 Jahren 0
7
jamesdlin

Bei einer interaktiven Shell wird durch Drücken Ctrl+xvon und *nach dem Eingeben des Glob-Musters die Befehlszeile mit dem erweiterten Glob-Muster bearbeitet. Von der Bash-Man-Seite:

glob-expand-word ( C-x *)

Das Wort vor dem Punkt wird als Muster für die Erweiterung des Pfadnamens behandelt, und die Liste der übereinstimmenden Dateinamen wird eingefügt und ersetzt das Wort. Wenn ein numerisches Argument angegeben wird, wird vor der Erweiterung des Pfadnamens ein Stern angehängt.

Möglicherweise interessieren Sie sich auch für Glob-List-Erweiterungen ( Ctrl+x, g).

Ich verwende bash von Mac OS. Ich habe versucht, Strg + X, Befehl + X. Ich bin nicht sicher, ob es eine Befehlszeile bearbeitet. Könntest du mehr ausarbeiten? Weishi Zeng vor 9 Jahren 0
Ich weiß nicht, warum es nicht für Sie funktioniert. Haben Sie unmittelbar nach der Eingabe von `echo * 'und vor dem Drücken der Eingabetaste` Strg + x, * `gedrückt? Wenn es immer noch nicht funktioniert, können Sie `~ / .inputrc` ändern und glob-expand-word an etwas anderes binden. jamesdlin vor 9 Jahren 0
contrl + x bewegt den Cursor zum Wortecho, bearbeitet aber nichts. "Strg + x, *" was bedeutet das? (ist es Strg + x ODER Strg + * ??) * ist auf Shift, also muss ich auch Shift drücken, um ein * zu erhalten, oder? Weishi Zeng vor 9 Jahren 0
Rechts, drücken Sie die Tastenkombination "Strg + x" gefolgt von "Shift + 8". Sie können versuchen, zu sehen, ob `Ctrl + x, g` funktioniert, oder, wie ich bereits sagte, Ihren eigenen Schlüssel in der` .inputrc'-Datei zuweisen. jamesdlin vor 9 Jahren 0
1
jjlin

Wenn Sie sehen möchten, wie Argumente erweitert oder tokenisiert werden, können Sie ein Programm oder Skript verwenden, das seine Argumente ausgibt. Hier ist eine Implementierung in bash:

#!/bin/bash  for (( i = 0; i <= $#; ++i )); do printf 'argv[%d] = %s\n' $i "${!i}" done 

Angenommen, Sie packen das in eine Datei namens printargs.sh(und machten sie ausführbar), dann würden Sie eine solche Ausgabe erhalten

$ ./printargs.sh ab argv[0] = ./printargs.sh argv[1] = a1b argv[2] = a2b argv[3] = a3b