Chciałbym zbudować krótką funkcję, aby wykonać następujące czynności. Powiedzmy, że przenoszę plik „file.tex” do mojego katalogu dokumentów:
mv file.tex ~/Documents
Następnie chciałbym przejść cd
do tego katalogu:
cd ~/Documents
Chciałbym uogólnić to na dowolny katalog, aby móc to zrobić:
mv file.tex ~/Documents
follow
i każ follow
poleceniu odczytać miejsce docelowe z poprzedniego polecenia, a następnie wykonaj je odpowiednio. W przypadku prostego katalogu nie oszczędza to dużo czasu, ale praca z katalogami zagnieżdżonymi byłaby ogromna, gdyby można było po prostu użyć
mv file.tex ~/Documents/folder1/subfolder1
follow
Myślałem, że będzie to stosunkowo proste i że mogę zrobić coś takiego:
follow()
{
place=`history 2 | sed -n '1p;1q' | rev | cut -d ' ' -f1 | rev`
cd $place
}
ale to nie działa. Jeśli echo $place
, otrzymuję żądany ciąg (testuję go ~/Documents
), ale zwraca ostatnie polecenie
No such file or directory
Katalog z pewnością istnieje. Jestem zagubiony. Czy możesz mi pomóc?
źródło
file.tex
oryginalnej lokalizacji, dowiązania symboliczne są bardzo dobrą alternatywą, ponieważ wystarczy tylko raz połączyć, a wtedy zawsze będzie wskazywać najnowszą wersję.cd
alt +,.
aby zastąpić ostatni token poprzedniego polecenia. Powtórz tę czynność, aby cofnąć się w historii ostatnich tokenów. (Mówię token nie arg, ponieważfoo &
grab&
jako ostatni token.) Możesz użyć argumentu numerycznego (na przykład z klawiszem Escape + 3 alt +.).Odpowiedzi:
Zamiast definiować funkcję, możesz użyć zmiennej
$_
, która jest rozwinięta do ostatniego argumentu poprzedniego polecenia obash
. Więc użyj:po
mv
komendzie.Możesz także użyć rozszerzenia historii:
Jeśli musisz użyć funkcji:
Uwaga: Ta odpowiedź jest skierowana na dokładny format argumentów wiersza poleceń, którego użyłeś, gdy mamy do czynienia z parametrami pozycyjnymi. W przypadku innych formatów, np.
mv -t foo bar.txt
Konieczne jest wcześniejsze włączenie określonych kontroli, wówczas odpowiednie byłoby opakowanie.źródło
cd !$
albocd $(dirname !$)
. Nie wiedziałem o$_
zmiennej!mv -t ~/Documents file.tex
zamiastmv file.tex ~/Documents
? Podsumowując, nie jestem pewien, czy jest to możliwe do rozwiązania w ogólnym przypadku ... funkcja otoki lub że reimplementacjamv
może być lepsza ...!$
jest równoważne!:$
i szybsze w pisaniu.W przypadku standardowych skrótów klawiszowych kombinacja Alt.skopiuje ostatni argument poprzedniego wiersza poleceń do bieżącego. Więc pisanie
poddałby się
i byłoby jeszcze mniej pisania niż słowo
follow
.Dla większej wygody powtarzanie Alt.kombinacji spowoduje przeglądanie ostatnich argumentów wszystkich poprzednich linii poleceń.
Dodatek: Nazwa polecenia bash odpowiadająca tej kombinacji klawiszy to
yank-last-arg
lubinsert-last-argument
. Można go znaleźć na stronie podręcznika bash pod „Poleceniami do manipulowania historią” lub w bardziej wyczerpującym podręczniku Bash Reference Manual ).źródło
<esc>
tego,.
aby uzyskać ten sam wynik<alt>+.
, co jest użyteczne, gdyPrawie na pewno napotykasz problem polegający na tym, że rozwinięcie tyldy występuje przed rozwinięciem parametru, co można wyjaśnić zwięzłym przykładem:
Można to rozwiązać za pomocą
eval
. W każdym razie będziesz potrzebowaćeval
, ponieważ pobierasz polecenia z historii i mogą one zawierać dowolne rozszerzenia, takie jak:(Występują problemy, takie jak to, że ponowna interpretacja tych wartości może już nie pasować do pierwotnej interpretacji, która miała miejsce. Załóżmy, że
compute_folder_name
jest to funkcja zwiększająca pewną zmienną globalną.)źródło
eval
. (Zawsze.) Ale dobre wyczuwanie problemów z sekwencją rozszerzeń. Jeśli wspomnisz o większej celowości poszerzenia historii korzystania z tegoeval
miejsca, będzie to moim zdaniem najlepsza odpowiedź; żadne z pozostałych nie wyjaśniło, dlaczego rozwiązanie Original Poster nie zadziałało.