Ich möchte eine kurze Funktion erstellen, um Folgendes zu tun. Angenommen, ich verschiebe die Datei 'file.tex' in mein Dokumentenverzeichnis:
mv file.tex ~/Documents
Dann möchte ich cd
zu diesem Verzeichnis:
cd ~/Documents
Ich möchte dies auf ein beliebiges Verzeichnis verallgemeinern, damit ich dies tun kann:
mv file.tex ~/Documents
follow
und lassen Sie den follow
Befehl das Ziel aus dem vorherigen Befehl lesen und dann entsprechend ausführen. Bei einem einfachen Verzeichnis spart dies nicht viel Zeit, aber wenn Sie mit verschachtelten Verzeichnissen arbeiten, wäre es enorm, wenn Sie nur diese verwenden könnten
mv file.tex ~/Documents/folder1/subfolder1
follow
Ich dachte, es wäre relativ einfach und ich könnte so etwas tun:
follow()
{
place=`history 2 | sed -n '1p;1q' | rev | cut -d ' ' -f1 | rev`
cd $place
}
aber das scheint nicht zu funktionieren. Wenn ich wiederhole $place
, erhalte ich die gewünschte Zeichenfolge (ich teste sie mit ~/Documents
), aber der letzte Befehl wird zurückgegeben
No such file or directory
Das Verzeichnis existiert auf jeden Fall. Ich bin ratlos. Könntest du mir helfen?
quelle
file.tex
den ursprünglichen Speicherort beizubehalten , da Sie nur einmal verlinken müssen und dann immer auf die neueste Version verweisen.cd
alt + ein,.
um das letzte Token des vorherigen Befehls zu ersetzen. Wiederholen Sie diesen Vorgang, um weiter in die Geschichte der letzten Token zurückzugehen. (Ich sage Token nicht Arg, weilfoo &
Grabs&
das letzte Token ist.) Sie können ein numerisches Argument verwenden (zum Beispiel mit Escape-3 Alt +.).Antworten:
Anstatt eine Funktion zu definieren, können Sie die Variable verwenden
$_
, die bis zum letzten Argument des vorherigen Befehls von erweitert wirdbash
. Also benutze:nach
mv
befehl.Sie können auch die Verlaufserweiterung verwenden:
Wenn Sie eine Funktion verwenden müssen:
NB: Diese Antwort ist auf das genaue Format der Befehlszeilenargumente ausgerichtet, das Sie beim Umgang mit Positionsparametern verwendet haben. Für andere Formate, z. B.
mv -t foo bar.txt
müssen Sie vorher bestimmte Überprüfungen vornehmen, ein Wrapper wäre dann angebracht.quelle
cd !$
oder getipptcd $(dirname !$)
. Wusste nichts über die$_
Variable!mv -t ~/Documents file.tex
stattmv file.tex ~/Documents
? Fazit: Ich bin mir nicht sicher, ob dies im Allgemeinen lösbar ist ... eine Wrapper-Funktion, oder ob Neuimplementierungenmv
besser sind ...!$
ist gleichbedeutend mit!:$
und schneller zu tippen.Bei Standard-Bash-Tastenkombinationen Alt.kopiert die Kombination das letzte Argument der vorherigen Befehlszeile in das aktuelle. Also tippen
ergäbe
und wäre noch weniger tippend als das Wort
follow
.Wenn Sie diese Alt.Kombination wiederholen, werden die letzten Argumente aller vorherigen Befehlszeilen durchsucht.
Anhang: Der Name des Bash-Befehls, der dieser Tastenkombination entspricht, ist
yank-last-arg
oderinsert-last-argument
. Sie finden es in der bash-Manpage unter "Befehle zum Manipulieren des Verlaufs" oder im ausführlicheren Bash-Referenzhandbuch .)quelle
<esc>
dann.
das gleiche Ergebnis wie zu bekommen<alt>+.
, das nützlich , wenn Sie remapped capslock haben zu entkommen :)Mit ziemlicher Sicherheit stoßen Sie auf das Problem, dass die Tilde-Erweiterung vor der Parameter-Erweiterung stattfindet, was durch ein kurzes Beispiel erklärt werden kann:
Dies kann mit angesprochen werden
eval
. Wie auch immer, Sie werden es braucheneval
, weil Sie Befehle aus dem Verlauf abrufen und sie beliebige Erweiterungen enthalten können, wie zum Beispiel:(Es gibt Probleme, zum Beispiel, dass die erneute Erweiterung dieser Werte möglicherweise nicht mehr mit der ursprünglichen Erweiterung übereinstimmt. Angenommen, es
compute_folder_name
handelt sich um eine Funktion, die eine globale Variable inkrementiert.)quelle
eval
. (Überhaupt.) Aber gute Beobachtung der Erweiterungssequenzprobleme. Wenn Sie die größere Zweckmäßigkeit der Geschichtserweiterungeval
hier erwähnen , ist dies meiner Meinung nach die beste Antwort. Keiner der anderen erklärt tatsächlich, warum die Lösung des Original-Posters nicht funktionierte.