Powtarzam wiele:
mkdir longtitleproject
cd longtitleproject
Czy można to zrobić w jednym wierszu bez powtarzania nazwy katalogu? Jestem tutaj na haju.
bash
shell
command-line
methodofaction
źródło
źródło
mcd
from unix.stackexchange.com/questions/6628/…mkdir longtitleproject
następniecd !^
Odpowiedzi:
Nie ma wbudowanego polecenia, ale możesz łatwo napisać funkcję, która wywołuje
mkdir
wtedycd
:Umieść ten kod w swoim
~/.bashrc
pliku (lub~/.kshrc
dla użytkowników ksh lub~/.zshrc
dla użytkowników zsh). Definiuje funkcję o nazwiemkcd
."$1"
zostanie zastąpiony argumentem funkcji po uruchomieniu.Ta prosta wersja ma kilka wad:
-p
opcję domkdir
. (Może to być lub nie być pożądane, ponieważ zwiększa ryzyko, że literówkamkcd mydierctory/newsub
pozostanie niewykryta, np. Z przyjemnością utworzymydierctory
imydierctory/newsub
kiedy zamierzasz utworzyćnewsub
wewnątrz istniejącejmydirectory
).-
ale nie tylko-
, wtedymkdir
icd
zinterpretuje go jako opcję. Jeśli tak-
, tocd
zinterpretuje to w znaczeniu$OLDPWD
. Jeśli po nim+
następuje 0 lub więcej cyfr, tocd
w zsh zinterpretuje to jako indeks na stosie katalogów. Możesz rozwiązać pierwszy problem, ale nie pozostałe dwa, przekazując--
przed argumentem. Możesz rozwiązać wszystkie te problemy, przygotowując./
argument, jeśli jest to ścieżka względna.mkdir
nie następujeCDPATH
, alecd
tak jest, więc jeśli ustawiszCDPATH
wartość, która nie zaczyna się od.
(co prawda nieco nietypowa konfiguracja),cd
możesz przenieść cię do innego katalogu niż właśnie utworzony. Przygotowanie./
do ścieżek względnych naprawia to (powodujeCDPATH
zignorowanie).mkdir
nie powiedzie, próbuje się wykonaćcd
. Poprawka: użyj,&&
aby rozdzielić dwa polecenia.Wciąż dość proste:
Ta wersja wciąż ma potencjał, aby
cd
przejść do innego katalogu niż ten, którymkdir
właśnie utworzono w jednym przypadku krawędzi: jeśli argumentmkcd
zawiera..
i przechodzi przez dowiązanie symboliczne. Na przykład, jeśli bieżący katalog jest/tmp/here
imylink
jest dowiązaniem symbolicznym do/somewhere/else
, wówczasmkdir mylink/../foo
tworzy,/somewhere/else/foo
podczas gdycd mylink/../foo
zmienia się wfoo
. Nie wystarczy szukać dowiązań symbolicznych w argumencie, ponieważ powłoka śledzi również dowiązania symboliczne w swoim bieżącym katalogu, więccd /tmp/mylink; mkdir ../foo; cd ../foo
nie zmienia się w nowy katalog (/somewhere/else/foo
), ale w/tmp/foo
. Rozwiązaniem tegocd
problemu jest zezwolenie wbudowanemu na rozpoznanie wszystkich..
komponentów ścieżki w pierwszej kolejności (nie ma sensu używaćfoo/..
iffoo
nie istnieje, więcmkdir
nigdy nie trzeba go widzieć..
).Dochodzimy do tej solidnej, choć nieco krwawej wersji:
(Ćwiczenie: dlaczego używam podpowłoki do pierwszego
cd
połączenia?)Istnieją również mniej wyspecjalizowane sposoby, aby nie musieć wpisywać słowa z poprzedniego wiersza:
cd
, a następnie Esc .(lub Alt+ .), aby wstawić ostatni argument z poprzedniego polecenia.cd !$
wykonujecd
się na ostatnim argumencie poprzedniego polecenia.mkdir
nacd
.źródło
ksh
, a także działa wzsh
) dla „powtórz ostatnie słowo poprzedniego polecenia”. Używam tego dość często./a/b/..//
faktycznie działałoby, ale nie działało/a/b/../c
. Naprawiony. Zadałem to pytanie szerszej publiczności.mkcd() { mkdir -p "$1" && cd "$1"; }
nie wydaje się być problemem w (moim przypadku) zsh.mkdir -p /var/tmp/somewhere/else /tmp/here; cd /tmp/here; ln -s /var/tmp/somewhere/else mylink; mkdir -p mylink/../foo && cd mylink/../foo; pwd
(obejmuje konfigurację i) wyświetla,/tmp/here/foo
co zostało utworzone (i czego się spodziewałem).bash
błędnie tworzy i zmienia się w/var/tmp/somewhere/foo
.Jest to jedna linijka, której potrzebujesz. Nie jest wymagana żadna inna konfiguracja:
$_
Zmienna, w bash, jest ostatnim argumentem podane do poprzedniego polecenia. W takim przypadku nazwa właśnie utworzonego katalogu. Jak wyjaśniono wman bash
:Służy
cd $_
do pobierania ostatniego argumentu poprzedniego polecenia zamiast,cd !$
ponieważcd !$
podaje ostatni argument poprzedniego polecenia w historii powłoki :kończysz w domu (lub ~ /)
kończysz w nowym folderze pod domem !! (lub ~ / newfolder)
źródło
mkdir foo && cd foo
, co nie jest przydatne.Nigdy nie przyszło mi do głowy, aby opisać to zachowanie, ponieważ wpisuję następujące informacje prawie co godzinę ...
gdzie bash uprzejmie zastępuje
!$
ostatnie słowo ostatniego wiersza; tzn. podana długa nazwa katalogu.Ponadto uzupełnianie nazw plików jest Twoim przyjacielem w takich sytuacjach. Jeśli twój nowy katalog był jedynym plikiem w tym folderze, szybki podwójny plik TABda ci nowy katalog bez ponownego wchodzenia do niego.
Chociaż fajnie jest, że bash pozwala na tworzenie skryptów tak typowych zadań, jak inne odpowiedzi sugerują, myślę, że lepiej jest nauczyć się funkcji edycji wiersza poleceń, które bash ma do zaoferowania, aby podczas pracy na innym komputerze nie brakowało składni cukier dostarczany przez niestandardowe skrypty.
źródło
Zgodnie z Jakimi dostosowaniami dokonałeś się w swoim profilu powłoki, aby zwiększyć wydajność? , tak to robię:
oznacza to, że działa również, jeśli katalog już istnieje.
źródło
-p
Opcja mkdir będzie tłumić błędów.mcd
polecenie? Który pakiet lub projekt udostępnia to polecenie?Jeśli używasz Oh My Zsh, istnieje polecenie o nazwie take, które właśnie to robi. Wyglądałoby to mniej więcej tak.
Znalazłem to przypadkiem. Właśnie spojrzałem i jest wymieniony na tym cheatheat z wiki Oh My Zsh GitHub. Jest to dość przydatne polecenie i najwyraźniej bardzo łatwe do samodzielnego stworzenia.
źródło
take
:) Idealnie! btw - iTerm2 z Oh My Zsh. Istnieją tutaj 3 idealne odpowiedzi. Ten, autorstwa @ jesús-carrera i wybraną odpowiedź. Zależy od konfiguracji i preferencji.Lub możesz po prostu stworzyć krótką zmienną w locie i użyć jej dwukrotnie
x = longproject ; mkdir $x ; cd $x
- co, przyznaję, jest jeszcze dłuższe niż użycie funkcji shellscript :)źródło
Oto niewielki wariant, który warto wspomnieć:
Dodaj to do swojego,
~/.bash_profile
a będziesz mógł używaćmkdir
jak zwykle (kiedy już to zrobiszsource
), tyle że teraz uruchomi funkcję powyżej zamiast standardowegomkdir
polecenia.Zauważ, że to nie sprawdza poprawności danych wejściowych zgodnie z zaakceptowaną odpowiedzią Gillesa , ale pokazuje, jak możesz (skutecznie) zastąpić wbudowane.
Z dokumentów (nieco parafrazując):
Wierzę, że
builtin
osiąga podobny wynikcommand
.źródło
$dir
command
jako alternatywy.Dodanie funkcji pomocniczej do BASH, ZSH lub KSH
Utwórz
mkcd
polecenie dla swojego środowiska w jednym wierszuźródło
Zrobiłem skrypt, który tworzy katalog, a następnie płyty CD, a następnie nadałem mu alias. A tutaj jest sedno, w którym to opisuję.
https://gist.github.com/rehnen/34236d6ff270ccaa74b6#mkdir-like-it-was-meant-to-be
źródło
Właśnie zautomatyzowałem powyższe odpowiedzi i utworzyłem skrypt wykonywalny jednorazowo:
Po prostu skopiuj to do nowego pliku
mkcd.sh
i uruchom tylko raz w terminalu przezbash mkcd.sh
. Następnie uruchom,source ~/.bashrc
aby działał w bieżącej sesji.Następnie możesz użyć
mkcd some_dir
do utworzenia i przejścia bezpośrednio do tego katalogu.źródło
~/.bashrc
pliku (z udzieloną już odpowiedzią)? A jak sugerujesz utworzenie tegomkcd.sh
skryptu? Może z redaktorem? To wygląda na więcej pracy niż tylko edycję~/.bashrc
. Jakie to ma przewagę nad przyjętą odpowiedzią? ……………………………………………………………………… PS To się nie powiedzie z powodu cytowania problemów, które mówią mi, że nawet nie próbowałeś tego.