ubuntuusers.de

Alias funktioniert, aber nicht als Skript

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

michahe

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 857

Hallo,

gemäß dieser Anleitung habe ich in meiner .bashrc einen Alias definiert:

HISTformat() { HISTTIMEFORMAT="%F %T | " history "$@" | sed 's#^ *[0-9]\+ *##'; 

Die Terminal-Eingabe

$HISTformat

erzeugt die gewünschte Ausgabe. Die Zeile HISTformat > FORMATIERT.txt in einer Skript.sh liefert eine leere Datei. Was mache ich falsch?

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9567

Wohnort: Münster

michahe schrieb:

Hallo,

gemäß dieser Anleitung habe ich in meiner .bashrc einen Alias definiert:

HISTformat() { HISTTIMEFORMAT="%F %T | " history "$@" | sed 's#^ *[0-9]\+ *##'; 

Das ist kein Alias, sondern eine Funktion.

Die Terminal-Eingabe

$HISTformat

erzeugt die gewünschte Ausgabe. Die Zeile HISTformat > FORMATIERT.txt in einer Skript.sh liefert eine leere Datei. Was mache ich falsch?

Vermutlich: Nichts. Die History des laufenden Skriptes ist nicht identisch mit der History der aufrufenden Shell, sondern leer.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4658

Wohnort: Berlin

@michahe Nur mal so als Anmerkung: Beide Eingaben sind kaputt. Bei der Funktionsdefinition fehlt die schliessende geschweifte Klammer und beim Aufruf gehört das Dollarzeichen nicht an den Anfang.

michahe

(Themenstarter)

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 857

@Marc_BlackJack_Rintsch: Danke, zwei Typo-Fehler in meinem Posting, meine Datei / mein Befehl (mit Shell-Prompt):

HISTformat() { HISTTIMEFORMAT="%F | %T | " history "$@" | sed 's#^ *[0-9]\+ *##'; }
$ HISTformat

Wie müsste denn ein Skript aussehen, das die Funktion auf die History der aufrufenden Shell auslöst?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13131

michahe schrieb:

Wie müsste denn ein Skript aussehen, das die Funktion auf die History der aufrufenden Shell auslöst?

Was meinst Du mit "aufrufende Shell"? Dies ist eine Shell-Funktion und wird von der aktuellen Shell ausgeführt, aus der Du sie aufrufst. Am besten definierst Du sie in ~/.bash_aliases und machst sie damit jeder interaktiven Shell verfügbar.

michahe

(Themenstarter)

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 857

rklm schrieb:

michahe schrieb:

Wie müsste denn ein Skript aussehen, das die Funktion auf die History der aufrufenden Shell auslöst?

Was meinst Du mit "aufrufende Shell"?

kB schrieb:

Das ist kein Alias, sondern eine Funktion. Die History des laufenden Skriptes ist nicht identisch mit der History der aufrufenden Shell, sondern leer.

Ich bezog mich auf den Text von kB zum Unterschied History des laufenden Skriptes versus History der aufrufenden Shell. Ich möchte

  • ein Skript, das die History der aufrufenden Shell liefert

  • und nicht eine Definition in ~/.bash_aliases anlegen.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13131

michahe schrieb:

rklm schrieb:

Was meinst Du mit "aufrufende Shell"?

Ich bezog mich auf den Text von kB zum Unterschied History des laufenden Skriptes versus History der aufrufenden Shell.

Das bedeutet nur, dass die Historie einer interaktiven Shell nicht an Shells weitergegeben werden, die diese interaktive Shell startet.

Ich möchte

  • ein Skript, das die History der aufrufenden Shell liefert

Das wird nicht gehen, denn die Shell hat keine API o.ä., über die sie ihre Historie verrät, und sie vererbt sie auch nicht so wie Umgebungsvariablen an weitere Shells, die Skripte ausführen.

  • und nicht eine Definition in ~/.bash_aliases anlegen.

Das ist aber eine funktionierende und elegante Lösung. Was ist der Grund, die Shell-Funktion nicht in ~/.bash_aliases zu definieren?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17596

Wohnort: Berlin

kB schrieb:

Die Zeile HISTformat > FORMATIERT.txt in einer Skript.sh liefert eine leere Datei. Was mache ich falsch?

Vermutlich: Nichts. Die History des laufenden Skriptes ist nicht identisch mit der History der aufrufenden Shell, sondern leer.

Nein (selbstdokumentierender Beweis):

1
2
3
4
5
6
t530:~/tmp/findtest 🐧> echo "history | tail -3" > histail.sh 
t530:~/tmp/findtest 🐧> chmod +x histail.sh 
t530:~/tmp/findtest 🐧> ./histail.sh 
  565  30.09.2024 17:36:53 echo "history | tail" > histail.sh 
  566  30.09.2024 17:37:00 chmod +x histail.sh 
  567  30.09.2024 17:37:05 ./histail.sh 

Das Skript hat keine eigene History und die ist auch nicht leer, sondern die History der aufrufenden Shell.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17596

Wohnort: Berlin

Vielmehr ist das Problem, dass Scripte nicht Funktionen der aufrufenden Shell erben.

Du kannst:

  • sie mit export -f histail aber exportieren, so dass sie dort sichtbar sind.

  • sie im Script mit source xy.sh als Script importieren.

  • sie in ~/.bash_aliases oder ~/.bashrc hinterlegen, wo sie automatisch eingebunden werden.

Die Unterschiede sind solche der Bequemlichkeit. Für ein, zwei Aufrufe wird man eine Funktion in der Shell hinflapsen und mit export dann verfügbar machen, wenn ein ad-hoc-Script sie benutzen soll.

Braucht man die Funktion in Zukunft häufiger, dann wird man sie als Script speichern wollen, um sie nicht jedes Mal neu schreiben zu müssen.

Braucht man sie so oft, dass das Sourcen des Scripts nervig wird, packt man sie in die .bashrc oder etwas Äquivalentes.

Beispiel (Funktion in eigenem File):

1
2
3
4
# hisfun.sh 
histail () { 
    history | tail -$1
} 

Beispiel (Sourcen des Scripts und Aufruf der Funktion):

1
2
3
# ht4.sh 
. ./hisfun.sh
histail 4

Im wahren Leben natürlich mit Shebang und absoluten Pfaden bzw. Script in einem PATH-Verzeichnis (~/bin wird vom Poster empfohlen). Ausführbarmachen nicht vergessen.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4658

Wohnort: Berlin

@user_unknown: Der selbsdokumentierende Beweis funktioniert so nicht:

bj@s8n:~$ echo -e '#!/bin/bash\nhistory | tail -3' > histail.sh
bj@s8n:~$ chmod +x histail.sh
bj@s8n:~$ ./histail.sh

Da habe ich jetzt nix vergessen, sondern da wird tatsächlich nix ausgegeben. Der Unterschied ist, das bei mir durch den She-Bang tatsächlich eine neue Shell mit leerer History gestartet wird.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17596

Wohnort: Berlin

Marc_BlackJack_Rintsch schrieb:

@user_unknown: Der selbsdokumentierende Beweis funktioniert so nicht:

bj@s8n:~$ echo -e '#!/bin/bash\nhistory | tail -3' > histail.sh
bj@s8n:~$ chmod +x histail.sh
bj@s8n:~$ ./histail.sh

Da habe ich jetzt nix vergessen, sondern da wird tatsächlich nix ausgegeben. Der Unterschied ist, das bei mir durch den She-Bang tatsächlich eine neue Shell mit leerer History gestartet wird.

Oha! Diesen Seiteneffekt eines Shebangs kannte ich bislang nicht.

Nun - daraus folgt schlicht, dass wir den Shebang dann einfach weglassen, oder?

Ich bin ja kein Experte für POSIX und andere Shells als Bash, aber wer an der laufenden History interessiert ist, der bewegt sich wohl in einer interaktiven Shell, die per Default bei ubuntuartigen Systemen die Bash ist.

Der impliziten Dokumentation nennen wir das Ding dann nicht xy.sh, sondern xy.bash, was eine seltene, aber keine nie gesehene Dateiendung ist. Der Befehl history ist ohnehin ein Bashism, ist er nicht?

Der Unterschied ist, das bei mir durch den She-Bang tatsächlich eine neue Shell mit leerer History gestartet wird.

Ich glaube da muss ich Deine Korrektur korrigieren. Es wird nicht mit leerer, sondern ohne History gestartet, wenn Du einen Shebang nutzt:

Hier 2 neue Bausteine eines Beweises:

1
2
echo -e 'echo $SHELL             \necho zeile 2\necho zeile 3\nhistory' > histroy.bash ; chmod +x histroy.bash; ./histroy.bash | tail -5
echo -e '#!/bin/bash\necho $SHELL\necho zeile 2\necho zeile 3\nhistory' > histroy.bash ; chmod +x histroy.bash; ./histroy.bash | tail -5 

Nr. 1 erbt die History und zeigt sie auch an, Nr. 2 übergeht derlei Versuche stillschweigend und gibt nichts aus.

Muss jetzt aber kurz fort und kann nicht weiter meinem Forschergeist frönen, der mich drängt, in der Manpage mehr Infos zur History zu schürfen.

Antworten |