Keine Aliase hier
Nehmen wir an, wir haben die Alias-Definition alias rm='rm -i'
in unserer ~/.bashrc
. Der Alias fügt die Option zum Auffordern vor dem Entfernen jeder Datei hinzu:
$ touch ./file
$ rm ./file
/bin/rm: remove regular empty file ‘./file’?
Es ist nicht die Schuld, strace
dass der Alias nicht verwendet wurde:
Es hat einfach nichts mit Aliasen zu tun.
Im Befehl
$ strace -f -e file -o rm.strace rm ./file
Die Wörter rm
und ./file
sind vorerst nur Argumente für strace - die Shell kann den Alias nicht erweitern rm
, da sie nicht wissen kann, dass strace diese Argumente später als Befehl verwendet.
Im Allgemeinen können Befehls-Aliase nur dort verwendet werden, wo Befehle verwendet werden können.
Aliase sind eine Funktion der Shell und verwenden strace
überhaupt keine Shell, wenn der Befehl über die Befehlszeile aufgerufen wird. Es wird exec()
stattdessen mit den Befehlen und Argumenten aus der eigenen Befehlszeile verwendet.
Innerhalb von strace
, wird der Befehl mit etwas ähnlichem genannt werden exec("rm", "file")
, und exec()
findet /bin/rm
in PATH - ohne eine Shell zu verwenden.
Explizite Shell
Warum nicht eine Shell in den strace
Befehl aufnehmen?
$ touch ./file
$ strace -f -e file -o rm.strace bash -c 'rm ./file'
$ ls ./file
ls: cannot access ./file: No such file or directory
Hmm ... das hat nicht funktioniert. rm
habe gerade die Datei ohne -i
Aufforderung gelöscht .
Interaktive Aliase
Aliase werden normalerweise nur in interaktiven Shells aktiviert, den tatsächlichen Befehlszeilen in einem Terminal.
Bei unserem Beispielalias ist leicht zu erkennen, warum dies sinnvoll ist: Wenn der rm -i
Alias in Shell-Skripten erweitert würde, würden sie beim ersten Mal hängen bleiben, ohne dass jemand rm
zum Drücken da wäre y
.
Aliase werden von der Shell-Option gesteuert expand_aliases
. Wir könnten die Option mit einstellen bash +O expand_aliases -c ...
. Das reicht aber nicht, denn die nicht interaktive Shell liest auch nicht ~/.bashrc
. Das heißt, unser Alias wird nicht nur durch die Option ausgeschaltet, sondern auch nicht einmal definiert.
Vorgeben, interaktiv zu sein
Die einfache Möglichkeit, beide Teile zu handhaben, besteht darin, die Befehlszeilenoption -i
zu verwenden, damit die Shell so tut, als wäre sie interaktiv:
$ touch ./file
$ strace -f -e file -o rm.strace bash -i -c 'rm ./file'
/bin/rm: remove regular empty file ‘./file’?
Schließlich wurde der -i
Alias verwendet!
Beachten Sie, dass Sie normalerweise keine Shells verwenden würden, die mit der -i
Option zum Erstellen von Skripten ausgeführt werden, selbst wenn Sie beispielsweise Ihre Aliase verfügbar haben möchten.
strace
ignoriert Aliase nicht, da dies bedeuten würde, dass überhaupt etwas zu ignorieren wäre. Ein Alias ist ein Merkmal der Shell.strace
ist ein anderes Programm, und innerhalbstrace
des Konzepts der Aliase existiert nicht, daher gibt es nichts zu ignorieren. Die vom Kernel bereitgestellte API zum Ausführen von Programmen enthält ebenfalls kein Aliase-Konzept. Daher kann die Shell auf keinen Fall einen Hinweis auf Aliase geben, selbst wenn dies gewünscht wird.