Wie starte ich bash und tippe sofort einen Befehl ein?

2

Ich möchte, dass bash zuerst einen Befehl ausführt, aber nach Beendigung des Befehls (oder Ctrl+ C'ed) in den interaktiven Modus wechselt (vorzugsweise mit dem Befehl im Verlauf, der für verfügbar ist up).

Wie erreicht man es am einfachsten und schönsten?

Inspiriert von cmd.exe /K:

$ wineconsole cmd.exe /K echo qqq
qqq

Z:\home\wine>
Vi.
quelle

Antworten:

3

Sauberere Version der Antwort von Scott :

  1. Setzen Sie dies auf .bash_profile:

    if [ ! -z "$EXECUTE_COMMAND" ]; then
        history -s "$EXECUTE_COMMAND"
        $EXECUTE_COMMAND
    fi
  2. Starten Sie die Bash so:

    $ EXECUTE_COMMAND='ping 127.0.0.1' bash -l
    PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
    64 bytes from 127.0.0.1: icmp_req=1 ttl=64 time=0.177 ms
    ...
    ^C
    5 packets transmitted, 5 received, 0% packet loss, time 3996ms
    $
    $ ping 127.0.0.1
Vi.
quelle
Gute Bereinigung. Ich bin froh, dass das history –sfunktioniert .bash_profile.
Scott
2

Ich bin nicht zu 100% sicher, dass ich genau verstehe, wonach Sie fragen, und leider habe ich bashim Moment keinen Zugriff auf ein System, auf dem es installiert ist , aber vielleicht hilft Ihnen Folgendes. Setzen Sie dies am Ende Ihres .bashrc:

if [-f ~ / .bash_initial_command]
dann
    . ~ / .bash_initial_command
    rm ~ / .bash_initial_command
fi

(Wo .bash_initial_commandist ein beliebiger Dateiname; wählen Sie einen anderen aus, wenn Sie möchten), und schreiben Sie dann ein Skript, das dies ausführt:

(echo "history –s '$ @'"; echo "$ @")> ~ / .bash_initial_command

Das heißt, der Befehl (der dem obigen Skript als Argumente präsentiert wird) wird an einer Stelle abgelegt, an der der nächste bashzu startende Interaktive ihn findet und ausführt. (Wenn Sie beispielsweise ausführen set_up_cmd ls –l, wird der nächste bashausgeführt ls –l.)  history –sStellt einen Befehl in den Verlauf, ohne ihn auszuführen.
Hinweis: Ich weiß nicht, ob das funktionieren wird .bashrc.

Dies muss verfeinert werden, wenn Sie Befehle mit Anführungszeichen (dh Sonderzeichen in Anführungszeichen) oder Umleitungen ( <oder >) verwenden möchten . oder eine Verbindung Befehle (dh enthält ;, |, &&, oder ||).

Ein kleines Problem: Wenn Sie Ctrl+ Cden Befehl eingeben, wird die .bashrcVerarbeitung wahrscheinlich abgebrochen und das .bash_initial_commandLöschen der Datei verhindert . Damit können Sie wahrscheinlich umgehen

if [-f ~ / .bash_initial_command]
dann
    mv ~ / .bash_initial_command ~ / .bash_initial_command. $$
    trap "rm -f ~ / .bash_initial_command. $$" 0
    . ~ / .bash_initial_command. $$
    rm -f ~ / .bash_initial_command. $$
fi

Dies gibt .bash_initial_commandeinen eindeutigen Namen, um Kollisionen zu vermeiden, und sorgt dafür, dass dieser beim Beenden der Shell gelöscht wird.

Wenn Sie in der Lage sein müssen, mehrere davon gleichzeitig zu starten, sollten Sie den Namen "tty" $(basename $(tty))in den .bash_initial_commandDateinamen einfügen.

Umso wichtiger ist es natürlich, dass Ihr Home-Verzeichnis nur von Ihnen selbst beschreibbar ist.

Scott
quelle
Ein bisschen schrullig ...
Vi.
@Vi .: Sie wollen auch nicht wissen, wie Wurst hergestellt wird. Aber macht es, was Sie wollen?
Scott
Nun schauen wir uns an, wie man es als mehr oder weniger einfaches Skript ohne .bash_profile-Hackerei macht.
Vi.
Fertig (ohne `tty` oder .bash_initial_command, obwohl noch mit .bash_profile)
Vi.
0

Sie können den Befehl zu .bash_profileoder hinzufügen .bashrc. Es wird ausgeführt, sobald Sie ein neues Fenster öffnen oder sich bei Ihrem Computer anmelden.

Auf dieser Seite finden Sie Informationen zu den Unterschieden zwischen den beiden Dateien.

Stephen Schrauger
quelle
Oder möchten Sie einen neuen Bash-Prozess über eine bereits gestartete Befehlszeile starten, den Befehl als Parameter übergeben und dann nach Abschluss des Befehls in diesem Bash-Prozess bleiben?
Stephen Schrauger
Ja. Eigentlich möchte ich gnome-terminal mit mehreren vorgeöffneten Registerkarten starten, aber wo kann ich Strg + C und (wahrscheinlich mit hinzugefügten Parmetern) Befehle einfach neu starten.
Vi.