
Stellen Sie sich eine Situation vor, in der ich diese Befehle in meiner aktuellen Shell ausführe oder sie darin einfüge .bashrc
:
alias source='echo hi'
alias .='echo hi'
alias unalias='echo hi'
Oder function source(){ echo hi; }
usw.
Bei Binärbefehlen können wir einen absoluten Pfad wie diesen verwenden: /bin/ls
, aber wie kann ich einen dieser in die Shell integrierten Befehle gezielt in meiner aktuellen Shell ausführen?
Antwort1
builtin
Bash hat dafür den Befehl :
builtin: builtin [shell-builtin [arg ...]]
Execute shell builtins.
Execute SHELL-BUILTIN with arguments ARGs without performing command
lookup.
Z.B
$ cat > hello.sh
echo hello
$ source() { echo x ; }
$ source hello.sh
x
$ builtin source hello.sh
hello
Es steht Ihnen jedoch nichts entgegen, zu überschreiben builtin
.
Eine andere Möglichkeit, Aliase (aber nicht Funktionen) zu umgehen, besteht darin, (einen Teil) des Wortes in Anführungszeichen zu setzen:
$ alias source="echo x"
$ source hello.sh
x hello.sh
$ \source hello.sh
hello
Antwort2
Aliase können immer umgangen werden, indem ein beliebiger Teil des Befehlsnamens in Anführungszeichen gesetzt wird, z. B. \source
oder 'source'
oder ''source
oder … (es sei denn, Sie haben auch dafür Aliase definiert, was bei zsh
, aber nicht bei anderen Shells, zulässig ist).
Funktionen können in jeder POSIX-Shell mit dem command
Präfix (eg command source
) umgangen werden. In Bash oder Zsh können Sie builtin
anstelle von verwenden command
, um die Verwendung eines integrierten Elements zu erzwingen ( command
greift auf eine PATH
Suche zurück, wenn kein integriertes Element mit diesem Namen vorhanden ist, und überspringt in Zsh (außer bei der Emulation anderer Shells) command
integrierte Elemente vollständig). Sie können eine Funktion mit eg aufheben unset -f source
.
Wenn Sie, und alle überschrieben oder deaktiviert haben builtin
, müssen Sie möglicherweise den Gedanken aufgeben, diese Shell-Instanz in einen vernünftigen Zustand wiederherzustellen.command
unset