Ist es möglich, die integrierte Bash-Funktion von einem Nicht-Bash-Skript aus auszuführen?

Ist es möglich, die integrierte Bash-Funktion von einem Nicht-Bash-Skript aus auszuführen?

Ist es beispielsweise möglich, history -wdie zugrunde liegende Bash-Shell über ein Ruby-Skript auszuführen?
Oder ist es besser möglich, einen integrierten Befehl für die Bash-Shell auszuführen, wenn nur deren PID bekannt ist?

Die einzige Möglichkeit, die ich gefunden habe, besteht darin, das Signal abzufangen trap "history -w" SIGUSR1und dann das Signal an den Prozess zu senden, aber ich bin nicht sicher, ob das eine gute Vorgehensweise ist, und USR1 wird von Bash nicht verwendet. Außerdem kann ich auf diese Weise maximal 2 Befehle ausführen (USR1 und USR2). Und ich muss das Trap definieren, bevor ich es verwenden kann.

Ich bin auf einem Mac, also gibt es nicht SIGRTMIN..SIGRTMAX.

Warum ich das brauche:

Ich habe ein Ruby-Shell-Skript erstellt, dtdas einen neuen Tab neben dem aktuellen mit demselben Arbeitsverzeichnis öffnet, dann habe ich geschriebennewTabHere.appdas dasselbe kann, aber auch, wenn die Registerkarte gerade etwas ausführt (ich nenne es usingFunke). Es wäre aber viel besser, wenn der Verlauf auch in der duplizierten Registerkarte derselbe wäre und dtich einfach verwenden könnte alias dt='history -w; dt', aber wie kann ich dies von aus tun newTabHere.app?

Antwort1

Es gibt keine vorgefertigte Möglichkeit, eine Shell dazu zu bringen, einen Befehl auszuführen, außer ihn auf ihrer Standardeingabe einzugeben. Am einfachsten wäre es, wenn Bash eine Datei überprüft oder history -wals Teil von PROMPT_COMMAND(einem Befehl, der vor jeder Eingabeaufforderung ausgeführt wird) ausführt.

Ich denke, was Sie wollen, ist in der TatEchtzeit-Verlaufsexport zwischen Bash-Terminalfenstern, und vielleichtBesserer Bash-Verlauf.

Sie können auch die Verwendung vonzsh(verfügbar in den meisten Linux/OSX/anderen Unix-Paket-Repositories) und seine inc_append_historyundshare_history Optionen.

Antwort2

Für diesen speziellen Anwendungsfall würde ich empfehlen, es einfach history -wzu Ihrem PROMPT_COMMAND(oder in der Shell-Funktion, die von dort aufgerufen wird) hinzuzufügen.

Generell würde ich vorschlagen, eine Warteschlange für von außen angeforderte Befehle zu haben und PROMPT_COMMANDdiese folgendermaßen auszuführen:

run_prompt_queue() {
  local f
  for f in ~/.bash_queue.d/$$-*
  do
    [[ -f $f ]] || continue # still works without nullglob
    . "$f"
    rm -fv "$f"
  done
}
PROMPT_COMMAND+=$'\n run_prompt_queue'
rm -v "$HOME/.bash_queue.d/$$-"* # clear random leftovers when PID is recycled

Erstellen Sie dann in Ihrem Python-Skript eine Datei mit den Befehlen, die Sie ausführen möchten, und benennen Sie sie um in sprintf("%s/.bash_queue.d/%u,%s", sys.env("HOME"), pid_of_bash, your_unique_suffix).

pid_of_bashist wahrscheinlich sys.getppid()oder, sys.getsid()aber das kann je nach Verschachtelungsebene Ihrer Skripte variieren.

Natürlich können Sie für die Benennung der Dateien Ihre eigene Konvention wählen, ich empfehle Ihnen jedoch dringend, die PID der Ziel-Shell zumindest als Option einzuschließen.

Wenn es Ihnen egal ist, welche bestimmte Shell Sie verwenden, können Sie auch basierend auf pgrp, sid, tty, Tageszeit usw. auslösen.)

Wichtiger Tipp:Stellen Sie sicher, dass niemand sonst in Ihr Warteschlangenverzeichnis schreiben kann.

verwandte Informationen