.bash_profile wird erst aktualisiert, wenn ein neues Terminalfenster geöffnet wird

Ich versuche, einen Terminalbefehl zu erstellen. Das habe ich bisher erstellt:

cd ~/ && touch .bash_profile && echo "" >> .bash_profile && echo "alias sendtext=\"osascript -e 'on run argv' -e 'tell application \\\"Messages\\\"' -e 'set myid to get id of first service' -e 'set address to item 1 of argv' -e 'set message to item 2 of argv' -e 'set receiver to buddy address of service id myid' -e 'send message to receiver' -e 'end tell' -e 'end run'\"" >> .bash_profile && echo "alias sendtext-remove=\"cd ~/ && grep -vwE \\\"(sendtext|sendtext-remove)\\\" .bash_profile > .bash_profile && . .bash_profile\"" >> .bash_profile && . .bash_profile

Es erstellt zwei Befehle:

  • sendtext [E-Mail] [Nachricht] (Sendet eine Textnachricht an eine E-Mail)
  • sendtext-remove (Entfernt die beiden Zeilen aus der .bash_profile)

Das Problem ist, dass sendtext-removeich nach dem Laufen immer noch laufen kann send text. Wie kann ich das .bash_profile aktualisieren, ohne ein neues Terminalfenster zu öffnen?

Das scheint ein nützlicher Alias ​​zu sein. Warum versuchst du es zu entfernen?
@glennjackman Ich versuche, es deinstallierbar zu machen.
In diesem Fall würde ich Ihre Aliase (ich würde Funktionen verwenden) in eine separate Datei einfügen und das Bash-Profil bearbeiten, um es zu lesen. Wenn die Deinstallation Ihres Codes mein .bash_profile auslöschen würde, würden Sie einen sehr verärgerten Kunden haben - seien Sie besser vorsichtig, wenn Sie diesen Code entfernen ( sedstattdessen verwenden)
@glennjackman Kannst du mir ein Beispiel geben, wie ich es verwenden soll sed? (Ich möchte die Zeilen entfernen, die mein Skript enthalten)
Ich werde meine Antwort erweitern, wenn ich nicht unterwegs bin
Bitte fügen Sie Antworten nicht direkt zur Frage hinzu, dies verwirrt sowohl die Benutzer als auch die Suchfunktion.
Dies sind zwei Fragen 1) gemäß Titel 2) Askimg für die sed - bitte bearbeiten Sie so, dass es nur eine ist
Können Sie erklären, was der Zweck dieser Arbeit ist? Warum nicht Standard-Shell-Skripte verwenden? .bash_profileist nicht als Shell-Skript gedacht, schon gar nicht als bewegliches Shell-Skript. Bitte machen Sie eine solche Klarstellung nicht in Kommentaren, sondern in Ihrer ursprünglichen Frage.

Antworten (2)

Das scheint eine Menge Arbeit zu sein

alias sendtext-remove='unalias sendtext sendtext-remove'

-- versuchen Sie, Ihre Spuren irgendwie zu verwischen, indem Sie die Datei bearbeiten?

Beachten Sie auch, dass "myfile" auf null Bytes gekürztgrep -v foo myfile > myfile wird ! Das liegt daran, dass die Umleitung zuerst erfolgt und grep dann eine leere Datei hat, mit der es arbeiten kann. Dann bezieht es eine leere Datei und nimmt keine Änderungen an Ihrer aktuell ausgeführten Shell vor.. ~/.bashrc

Grundsätzlich besteht Ihr Problem darin, dass Sie die Aliase in Ihrer aktuellen Shell nicht aufheben.


Ich wollte einige Funktionen für die Installation und Deinstallation aufschreiben, aber ich habe meine Meinung geändert. Ich denke nicht, dass Sie die Punktdateien Ihrer Benutzer für sie bearbeiten sollten. Wenn sie Ihre Sendtext-Funktion wollen, können Sie sie mit ihnen teilen, und wenn sie sie nicht wollen, können sie sie selbst entfernen. Ich würde es jedoch als Funktion schreiben, nur für die Lesbarkeit

sendtext() {
    osascript -e 'on run argv' \
              -e 'tell application "Messages"' \
              -e 'set myid to get id of first service' \
              -e 'set address to item 1 of argv' \
              -e 'set message to item 2 of argv' \
              -e 'set receiver to buddy address of service id myid' \
              -e 'send message to receiver' \
              -e 'end tell' \
              -e 'end run' \
              "$@"
} 
Würde das statt funktionieren grep?echo $(sed '/sendtext/d' .bash_profile) > .bash_profile
Nö. Gleiches Problem wie zuvor: Die Umleitung zerstört die Datei vor dem Start von echo / sed. Außerdem entfernt dieses Formular echo $(some_command)alle Zeilenumbrüche aus der Ausgabe von some_command.
sed: Überprüfen Sie Ihre sed-Manpage -- ein Beispiel: sed -i ".bak" '/sendtext/d' somefilewird eine Datei an Ort und Stelle bearbeiten.

Sie können das Bash-Profil mit dem folgenden Befehl über die Befehlszeile oder das Skript neu laden:

source ~/.bash_profile
Ich mache das im Grunde mit . .bash_profile(I cd into ~/ schon)