alias and function

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

alias and function

Beitrag von linuxCowboy » 27.07.2022 13:19:03

mein alias:

Code: Alles auswählen

$ alias F=false
$ alias T=true
meine test funktion:

Code: Alles auswählen

$ F(){ echo up yours;}
run:

Code: Alles auswählen

$ F
up yours

$ unset F
$ F
up yours

$ unset -f F
$ F
up yours
Könnt ihr das nachvollziehn?
Bug in bash?

manpage:
"A function definition may be deleted using the -f option to the unset builtin."

... except once in a blue moon ;-)
-der_linux_cowboy --- Besser werden! ... f*** w$$

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: alias and function

Beitrag von tobo » 27.07.2022 15:05:36

In ksh/mksh ist das Verhalten logischer:

Code: Alles auswählen

$ ksh
$ type F
ksh: whence: F: not found
$ alias F=true
$ type F
F is an alias for true
$ F(){ echo up yours;}
$ type F
F is an alias for true
$ F
$

$ sh
$ type F
F: not found
$ alias F=true
$ type F
F is an alias for true
$ F(){ echo up yours;}
$ type F
F is an alias for true
$ F
up yours
$
Die manpage von bash (überprüfbar mit set -x) sagt dazu:
man bash hat geschrieben: The rules concerning the definition and use of aliases are somewhat confusing. Bash always reads at least one complete line of input, and all lines that make up a compound command, before executing any of the commands on that line or the compound command. Aliases are expanded when a command is read, not when it is executed. Therefore, an alias definition appearing on the same line as another command does not take effect until the next line of input is read. The commands following the alias definition on that line are not affected by the new alias. This behavior is also an issue when functions are executed. Aliases are expanded when a function definition is read, not when the function is executed, because a function definition is itself a command. As a consequence, aliases defined in a function are not available until after that function is executed. To be safe, always put alias definitions on a separate line, and do not use alias in compound commands.
Und da unset keinen Alias löscht, ist das wohl so richtig.

Huo
Beiträge: 778
Registriert: 26.11.2017 14:03:31
Wohnort: Freiburg

Re: alias and function

Beitrag von Huo » 27.07.2022 16:16:17

Vielleicht eine Erklärung: Durch die parallele Definition von F als Alias für false und als Funktion verliert false seine Eigenschaft als Bash-Builtin (Boolescher Wert) und wird stattdessen zur definierten Funktion F; F wiederum wird zum Alias für diese Funktion false.

Die neu-definierte Funktion false lässt sich mit

Code: Alles auswählen

$ unset -f false
löschen, der Alias mit

Code: Alles auswählen

$ unalias F
$ type false
false ist eine von der Shell mitgelieferte Funktion.
$ alias F=false
$ F(){ echo up yours;}
$ type false
false ist eine Funktion.
false ()
{
echo up yours
}
$ false
up yours

$ unset -f F
$ F
up yours
$ unset -f false
$ F
$
$ unalias F
$ F
bash: F: Kommando nicht gefunden.

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: alias and function

Beitrag von linuxCowboy » 27.07.2022 17:49:52

@tobo
Also für mich ist das nicht richtig, aber danke für den Denkanstoss.

Offenbar setzt er false neu!

Code: Alles auswählen

$ type false
false is a function
false () 
{ 
    echo up yours
}
Bei einer Funktionsdefinition sollte kein Alias ersetzt werden!?

Oder aber in beide Richtungen.

So muss ich selber

Code: Alles auswählen

$ unset false
geben.

@Huo

Ja, danke, so ist es.

Kann man nur noch erklären, logisch ist das nicht mehr.

Die bash ist inzwischen zu komplex. Und ständig müssen und müssten neue Sonderfälle hinzukommen.

Wobei das imho ein besonders dicker Hund ist! Warum muss bei einer Funktionsdefinition der Funktionsname einer Aliasexpansion unterliegen?

Man lässt's und kann es irgendwie erklären. Oder man fügt einen weiteren Sonderfall hinzu und das Rad dreht sich weiter...
-der_linux_cowboy --- Besser werden! ... f*** w$$

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: alias and function

Beitrag von linuxCowboy » 22.08.2022 15:16:01

workaround / solution:

Code: Alles auswählen

 $ alias x='echo alias'

 $ function x { echo function;}

 $ type -a x
x is aliased to `echo alias'
x is a function

 $ x
alias

 $ \x
function

 $ unset x

 $ type -a x
x is aliased to `echo alias'

 $ x
alias
Das 'reserved word function' ist doch nicht so optional...
-der_linux_cowboy --- Besser werden! ... f*** w$$

Antworten