Wie einen Dateinamen als Befehlszeile im Terminal anzeigen?
Hallo
Ich möchte eine .py Datei aus einem Verzeichnis als Dateiname inkl. Pfadangabe über eine .bash_aliases im Terminal anzeigen lassen um dahinter noch einen Befehl wie add, del, list, start oder stop hinzuzufügen und auszuführen.
Die Zeile soll im geöffneten Terminal im bereits gemounteten Verzeichnis (in dem die betreffende .py Datei ist) angezeigt werden zum fertigstellen.
Beispiel:
Geöffnet im Terminal: user@user:~/tool1$
Alias: alias j='cd /home/user/tool1 && /home/user/tool1/tool1.py add'
So sollte es im Terminal dann angezeigt werden: user@user:~/tool1$ '/home/user/tool1/tool1.py' add
Was müsste ich im Alias eintragen, damit im bereits gemounteten Verzeichnis tool1 über "j" die Textzeile: " '/home/user/tool1/tool1.py' add" eingefügt wird, sodass ich gleich hinten dran im Terminal weiter schreiben kann z.B. ... add abcdef.
Mit "echo" wird die Pfadangabe+Dateiname nur angezeigt, aber nicht editierbar, weil gleich wieder eine Zeile drunter der Bash angezeigt wird.
Es soll quasi eine Abkürzung über Alias sein, dass ich nicht ständig die Datei aus dem Verzeichnis ins Terminal ziehen muss um die Datei auszuführen.
So sollte es über Alias im Terminal angezeigt werden:
Ich möchte nicht den "Inhalt" der Datei ausgeben lassen, z.B. über less oder cat. Es soll nur die Zeile " '/home/user/tool1/tool1.py' add " eingefügt und angezeigt werden im Terminal. Das ich dann nach "add" weiter schreiben kann.
Wieso nutzt du nicht einfach cat und führst es dann aus?
Ich hab mich bisher noch nicht mit cat beschäftigt.
Beim suchen hab ich eben das gefunden:
cat ./path/to/file.txt
Da müsste ich jedes mal händisch die Befehlszeile eingeben?
2 Antworten
warum willst du das mit einem Alias machen?
Schreibe den Befehl doch einfach in einen Datei. Der Name könnte doch so lauten wie der angedachte Alias-Name.
Im Script kannst du doch alles Mögliche auf den Bildschirm bringen.
Dem Script übergibst du das was du "add" nennst einfach als Parameter.
erst mal was ganz Einfaches
Als Kommando hier einfach ls
In der Kommandozeile könnte das ls *.jpg lauten. Du möchtest aber *.jpg eingeben.
die Datei nenne ich test.sh
Schreibe die Zeilen in diese Datei, mache sie mit chmod 777 test.sh ausführbar für "alle"
#!/bin/bash
echo "gibt jetzt was ein:"
read einvariablenName
ls $einvariablenName
echo "<<<<ENDE>>>>"
#### Erklärung:
#!/bin/bash sagt, dass die Datei ein Shell-Sript der bash ist
echo "gibt jetzt was ein:" sagt, Ausgabe auf den Monitor dieses Textes
read einvariablenName ließt eine Zeichenkette bis zum <Enter> und schreibt die getippten Zeichen in die Variable "einvariablenName"
ls $einvariablenName
führt den Befehl ls mit dem Inhalt der Variablen einvariablenName aus.
Das $ vor einvariablenName sagt, "nimm deren Inhalt"
Das Ergebnis wird dann durch ls ausgegeben. Zum Schluss wird noch <<<<ENDE>>>> ausgegeben.
Für einvariablenName kann natürlich a oder b oder ... benutzt werden. Bedenke, man muss auch noch nach Jahren so ein Script lesen können.
Viel Erfolg, frage weiter, wenn es notwendig ist!
Vielen Dank für das Script und die Mühe :-)
Leider funktioniert es (noch) nicht.
Ich hab es ausführbar gemacht, es öffnet sich aber nur im Text Editor.
Wenn ich es ins Terminal ziehe und Enter drücke kommt die Abfrage "gibt jetzt was ein:".
Wenn ich eingebe '/home/user/tool1/tool1.py' add kommt die Meldung:
ls: Zugriff auf "/home/user/tool1/tool1.py" nicht möglich: Datei oder Verzeichnis nicht gefunden
add
<<<<ENDE>>>>
Wenn ich im Script "gibt jetzt was ein:" mit " '/home/user/tool1/tool1.py' add " ersetze und bei read und ls "x" eingebe, erscheint: ls:
Zugriff auf '$' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf 'x' nicht möglich: Datei oder Verzeichnis nicht gefunden
#!/bin/bash
echo "/home/user/tool1/tool1.py"
read x
ls $ x
echo "<<<<ENDE>>>>"
Demnach versucht das Script auf das was ich eingebe zuzugreifen (Verzeichnis), was es aber nicht soll.
Es soll nur die Zeile" '/home/user/tool1/tool1.py' " im Terminal anzeigen nach dem Prompt zum weiterbearbeiten.
Deshalb wollte ich es über einen Alias machen:
Ich gebe "x" im Terminal ein und dann erscheint nach einem neuen Prompt: '/home/user/tool1/tool1.py' (genauso Zeichen für Zeichen) und ich ergänze dann noch den Befehl händisch mit z.B. del xyz123 und führe es per Enter drücken aus ($'/home/user/tool1/tool1.py' del xyz123 -> Enter)
Der alias x='echo /home/user/tool1/tool1.py' wäre im Prinzip perfekt, wenn es nicht gleich nach der Anzeige im Terminal sofort zum nächsten Prompt springen würde und ich die Zeile somit händisch nicht ergänzen und ausführen kann.
es öffnet sich aber nur im Text Editor
o.k. du klickst den Dateinamen bestimmt in einem Windowmanager (Nautilus oder Dolphin oder Thunar ... ) an. Der erkennt das .sh und lädt die Datei in einen Texteditor. Das machen Window-Manger so.
Als Script kannst du es erst einmal nur in einem Terminal starten.
Mehr als ls ausführen kann das Script aber nicht. Wenn du
/home/user/tool1/tool1.py starten willst und zusätzlich einen Parameter per Eingabe hinzufügen willst, dann musst du das Script anpassen.
statt
echo "gibt jetzt was ein:"
dann eben:
echo -en "tool1.py erwartet eine Eingabe\nbitte jetzt hier eingeben: "
das -en bewirkt, dass das \n als Zeilenumbruch gewertet wird und die Eingabe gleich nach dem : erfolgt (ohne Zeilenumbruch hinter eingeben:
Wenn du als Befehl /home/user/tool1/tool1.py ausführen lassen willst, dann muss im Script statt ls genau /home/user/tool1/tool1.py stehen.
Wenn du mal mehr Erfahrung hast, dann schreibe eine Zeile hinter #!/bin/bash
cmd1=/home/user/tool1/tool1.py
und dort wo in meinem Script ls steht
$cmd1 $einvariablenName
$cmd1 wird dann durch /home/user/tool1/tool1.py ersetzt und ausgeführt.
--------------------
Solltest du so etwas auch mit einer grafischen Oberfläche haben wollen, das geht genauso leicht mit tclsh als Shell (eben nicht die bash) und tk für grafische Elemente.
Auch da kann ich dir Ratschläge geben.
Leider funktioniert es nicht. Egal wie nach deiner Anleitung, das script will die Zeile immer "ausführen". Die Zeile soll einfach nur "eingefügt" werden nach dem Prompt zum weiter bearbeiten. Nichts weiter.
Aber ich hab eine andere Lösung gefunden: Im xfce4-terminal kann man in den Einstellungen als "Rechtsklickaction" "Auswahl einfügen" einstellen.
Nun wird alles was ich in Linux Mint markiere über Rechtsklick nach dem Prompt eingefügt und ich kann mit start/stop/add/del/list usw ergänzen und abschließen.
Im Prinzip dasselbe wie die Datei mit der Maus ins Terminal ziehen und zu ergänzen...
Schade das man im Terminal keine Datei mounten kann (cd /home/user/tool1/tool1.py) damit sie am Prompt geöffnet bleibt für Befehlseingaben.
Danke nochmal und ein schönes Rest-Wochenende
Endlich am Ziel angekommen Dank Deinem Script :-)
Lösung:
#!/bin/bash
echo -en "tool1.py erwartet eine Eingabe\nbitte jetzt hier eingeben: "
read einvariablenName
/home/user/tool1/tool1.py $einvariablenName
echo "<<<<ENDE>>>>"
Das Script als Alias in .bash_aliases:
alias x='cd /home/user/tool1 && bash /home/user/tool1/test.sh'
Nun erscheint nach eingabe von "x" die Abfrage und wird nach Eingabe + Enter ausgeführt. Perfekt
Danke und LG Vefan
'cd /home/user/tool1 && bash /home/user/tool1/test.sh'
das kannst du auch anders machen:
Schreibe in die Datei test.sh
hinter
#!/bin/bash
cd /home/user/tool1
dann brauchst du auch nur
./tool1.py $einvariablenName
schreiben, um tool1.py zu starten, denn ./ ist das Verzeichnis /home/user/tool1
Also eigentlich hast du zumindest in Bash ja die Möglichkeit, im Bash-Skript per $1, $2 Optionen mitzunehmen:
https://bash.cyberciti.biz/guide/$1
Wie man die in eine python-Datei rein fummelt weiß ich nicht.
Dann kannst du als Alias den Befehl via
$ befehl INPUT
überall aufrufen...
Mit py hat das eigentlich nix zu tun. Es geht nur darum das der Dateiname inkl. Pfadangabe über Alias-Befehl im Terminal dargestellt wird und ich hintendran noch Befehle einfüge wie add / start / stop usw. Als hätte ich es per Hand ins Terminal geschrieben. Bräuchte halt den ensprechenden Alias-Befehl, dass es genauso ausgeführt wird ;-)
Verstehe ich nicht, was dein Problem ist.
Alles nach dem Alias wird eigentlich an den Alias weiter gereicht. 🤷♂️ Bspw könntest du
alias apti=aptitude
Setzen. Machst du dann
apti update
wird aptitude mit der Option update aufgerufen. Bei dir also
alias XYZ='/home/user/tool1/tool1.py'
Da brauchst du keine Darstellung oder sonst was... Vorausgesetzt das environment stimmt und die Datei ist ausführbar.
Danke
Wenn ich dein Beispiel ausführe wird die Datei tool1.py ausgeführt und mir werden die Datei-Befehle aufgelistet. Die Datei soll aber NICHT ausgeführt werden, sondern einfach nur die (unvollständige) Befehlszeile nach dem Prompt angezeigt werden, damit ich sie händisch fertigstellen kann und enter drücke.
Das was ich nach "add" schreibe ändert sich ständig und MUSS ich händisch machen, z.B. jetzt a123, 2 Stunden später c771 usw. Sorry, weiß nicht wie ich es besser erklären soll ;-) Es soll einfach nur per alias nach dem Prompt /home/user/tool1/tool1.py' add eingefügt, aber nicht ausgeführt werden.
Danke
Da müsste ich mal sehen wie das funktioniert, da ich bis jetzt noch kein Script erstellt hab. Wie gesagt die Datei soll nicht ausgeführt werden, sondern nur die (unvollständige) Befehlszeile nach dem Prompt eingefügt werden, dass ich sie händisch fertigstelle und enter drücke.