Van egy egyvonalas vonal, amely lehetővé teszi számomra, hogy létrehozzak egy könyvtárat, és egyidejűleg belépjek abba?

Sokszor ismétlem magam:

 mkdir longtitleproject cd longtitleproject  

Van-e mód arra, hogy egy sorban végezzük el a könyvtárnév megismétlése nélkül? Itt vagyok.

Megjegyzések

Válasz

Ez az az egyvonalas vonal, amire szüksége van. Nincs szükség más konfigurációra:

mkdir longtitleproject && cd $_ 

A $_ változó a bash-ban, az előző parancs utolsó argumentuma. Ebben az esetben az imént létrehozott könyvtár neve. Amint azt a man bash cikkben kifejtettük:

_ At shell startup, set to the absolute pathname used to invoke the shell or shell script being executed as passed in the envi‐ ronment or argument list. Subsequently, expands to the last argument to the previous command, after expansion. Also set to the full pathname used to invoke each command executed and placed in the environment exported to that command. When check‐ ing mail, this parameter holds the name of the mail file cur‐ rently being checked."$_" is the last argument of the previous command. 

Használja a cd $_ parancsot az utolsó argumentum lekéréséhez Az előző parancs mentése a cd !$ helyett, mert a cd !$ megadja az előző parancs utolsó argumentumát a héj előzményeiben :

cd ~/ mkdir folder && cd !$ 

otthon vagy (vagy ~ /)

cd ~/ mkdir newfolder && cd $_ 

otthon új mappába kerülsz !! (vagy ~ / newfolder)

Megjegyzések

  • Miért nem a Földön ez az elfogadott válasz
  • @JSmyth Egyetértek , ez egy egyvonalas, amely natív shell funkciókat használ
  • Úgy gondolom, hogy az OP megpróbálja elkerülni a két parancs használatát. Ez a válasz (majdnem) ugyanolyan érvényes, mint a mkdir foo && cd foo, ami nem hasznos ‘.
  • Az OP olyan egyvonalas vonalat kér, amely nem igényli a ‘ ismételést a könyvtárnév megismételéséről, és ez az.
  • A szavazatok szerint ‘ s nyilvánvalóan sokan hasznosnak találják ezt a választ. ‘ ll kijelentem, miért nem választottam ‘ ezt a választ: I ‘ m nagyon valószínűleg hibásan írja be a && cd $_ szót, mivel a kulcsok annyira távol vannak az otthoni sortól, így technikailag helyes, de ‘ nem ergonómikus. Nagyra értékelem, hogy ‘ nem függ a környezettől, és ‘ hasznos tudni. Köszönöm!

Válasz

Nincs beépített parancs, de könnyen megadhat egy függvényt, amely felhívja mkdir, majd cd:

mkcd () { mkdir "$1" cd "$1" } 

Helyezze be ezt a kódot a ~/.bashrc fájlod (vagy a ksh felhasználók számára a ~/.kshrc, vagy a zsh felhasználók számára az ~/.zshrc). Meghatározza a mkcd nevű függvényt. "$1" helyére a függvény argumentuma kerül, amikor futtatja.

Ennek az egyszerű verziónak több hibája van:

  • Nem hozhat létre egyszerre alkönyvtárakat. Javítás: adja át a -p beállítást a mkdir. (Ez lehet vagy nem kívánatos, mivel növeli annak a kockázatát, hogy az elgépelés észrevétlen marad, pl. mkcd mydierctory/newsub boldogan hoz létre mydierctory és mydierctory/newsub amikor newsub -et akartál létrehozni a meglévő mydirectory.)
  • Ha az argumentum - -vel kezdődik, de nem “t csak -, majd mkdir és cd opcióként értelmezi. Ha csak -, akkor az cd úgy fogja értelmezni, hogy $OLDPWD. ez “s +, amelyet 0 vagy több számjegy követ, majd a zsh-ben található cd indexként értelmezi a könyvtár veremében. Az első problémát kijavíthatja, a másik kettőt nem, az -- átadásával az argumentum előtt. Mindezeket a problémákat úgy javíthatja ki, hogy előkészíti a ./ elemet az argumentumhoz, ha az relatív útvonalat mutat.
  • mkdir nem “követi a következőt: CDPATH, de cd, tehát ha beállította a CDPATH olyan értékre, amely nem “kezdődik . -nel (kétségkívül kissé szokatlan konfigurációval), akkor az cd más könyvtárba vezethet, mint az imént létrehozott.A ./ előkészítése a relatív útvonalakra kijavítja ezt¹ (a CDPATH figyelmen kívül hagyását okozza).
  • Ha nem sikerül, megpróbálja végrehajtani a cd parancsot. Javítás: a && segítségével válassza el a két parancsot.

Még mindig meglehetősen egyszerű:

 mkcd () { case "$1" in /*) :;; *) set -- "./$1";; esac mkdir -p "$1" && cd "$1" }  

Ez a verzió még mindig képes arra, hogy cd más könyvtárba kerüljön, mint az amelyet mkdir csak egy éles esetben hozott létre: ha az mkcd argumentum .. és szimbolikus kapcsolaton megy keresztül. Például, ha az aktuális könyvtár /tmp/here és az mylink szimbolikus link a /somewhere/else , akkor a mkdir mylink/../foo létrehozza a /somewhere/else/foo elemet, míg a cd mylink/../foo foo. Nem elég szimbolikus linkeket keresni az argumentumban, mert a shell a szimbolikus linkeket is követi a saját aktuális könyvtárában, így cd /tmp/mylink; mkdir ../foo; cd ../foo nem változik az új könyvtárba (/somewhere/else/foo), hanem a /tmp/foo fájlba. Ennek megoldása az, hogy a beépített cd megoldást engedi az összes .. útvonalkomponensek először (nincs értelme foo/.. -t használni, ha foo nem ” t létezik, ezért mkdir soha nem kell látnia ..).

Erre a robusztusra jutunk, ha kissé dicséretes verzió:

 mkcd () { case "$1" in */..|*/../) cd -- "$1";; # that doesn"t make any sense unless the directory already exists /*/../*) (cd "${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd -- "$1";; /*) mkdir -p "$1" && cd "$1";; */../*) (cd "./${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd "./$1";; ../*) (cd .. && mkdir -p "${1#.}") && cd "$1";; *) mkdir -p "./$1" && cd "./$1";; esac }  

(Gyakorlat: miért használok alhéjat az elsőhöz cd hívás?)

Ha az mkdir nem sikerül, biztos akarok lenni abban, hogy ne változtassam meg az aktuális könyvtárat. A CD-vel vagy a $ OLDPWD-vel történő visszaváltás nem elég jó, ha a shell nem rendelkezik engedély az aktuális könyvtárba váltáshoz. A cd frissítések hívása az OLDPWD-re is, ezért csak egyszer szeretnénk megtenni (vagy visszaállítani az OLDPWD-t).


Vannak kevésbé speciális módszerek hogy ne kelljen beírni a szót az előző sorból:

  • Írja be a cd , majd az Esc . (vagy Alt + . ) az előző parancs utolsó argumentumának beillesztéséhez.
  • cd !$ végrehajtja az cd parancsot az előző parancs utolsó argumentumán.
  • Az előző parancssor előhívásához nyomja meg a Fel gombot, majd szerkessze azt mkdir cd -re változtatására.

¹ vigyázzon, hogy nem működik a ksh93-ban, mivel a u+ verzió , javítva 93u + m / 1.0.0-alfában + d1483150 2021-01-05

Megjegyzések

  • Köszönöm! Számomra az Esc tűnik a legkényelmesebbnek, elvégzi a kulcssorozatot legyenek különleges m eaning?
  • ‘ csak a Bash (és öröklődik a ksh -ből, és a zsh) ” szekvencia az előző parancs utolsó szavának megismétlése “. Elég gyakran használom.
  • @Gilles I ‘ kezdem azt hinni, hogy a ” Gilles ” fiókot valójában egy szakértői testület osztja meg. 😉
  • @StephaneChazelas /a/b/..// valóban működne, de /a/b/../c nem. Rögzített. ‘ szélesebb közönség elé állítottam a kérdést.
  • mkcd() { mkdir -p "$1" && cd "$1"; } nem tűnik úgy, hogy problémát jelentene a zsh (példányomban). A 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 (tartalmazza a beállítást és) megjeleníti a (z) /tmp/here/foo elemet, amelyet létrehoztunk (és amire számítottam). A bash tévesen hoz létre és változik a /var/tmp/somewhere/foo fájlra.

Válasz

Sosem jutott volna eszembe ezt a viselkedést szkriptelni, mert a következőt óránként adom meg …

$ mkdir someDirectory<ENTER> $ cd !$ 

ahol a bash kedvesen helyettesíti a !$ -t az utolsó sor utolsó szavával; azaz a beírt hosszú könyvtárnév.

Ezenkívül a fájlnév kitöltése a barátja ilyen helyzetekben. Ha az új könyvtárad volt az egyetlen fájl a mappában, akkor egy gyors dupla TAB megadná az új könyvtárat anélkül, hogy újra meg kellene adnod.

Bár nagyon jó, hogy a bash lehetővé teszi ilyen gyakori feladatok szkripteléséhez, amint azt a többi válasz javasolja, jobbnak tartom megtanulni a bash által kínált parancssori szerkesztési funkciókat, hogy egy másik gépen dolgozva ne maradjon le az egyéni szkriptek által biztosított szintaktikus cukor.

Hozzászólások

  • Van-e jó hely, ahol megismerhetik az ehhez hasonló legfontosabb bash furcsaságokat?
  • @ dominicbri7 Általában a ” bash parancssori szerkesztés alá tartozik ” A Google keresése a következőket eredményezi csúcseredményként > web.mit.edu/gnu/doc/html/features_7.html Pontosabban, a! $ a Word Designator példája, lásd: gnu.org/software /bash/manual/bashref.html#Word-Designators

Válasz

Ha használja Ó, Zsh, van egy parancs, amely pontosan ezt csinálja. Valahogy így nézne ki.

take myfolder 

Ezt valójában véletlenül találtam meg. Csak néztem, és fel van sorolva a ez a cheatsheat az Oh My Zsh GitHub wikiből. Ez egy nagyon hasznos parancs, és láthatóan nagyon könnyen létrehozható.

Megjegyzések

  • Soha nem tudtam a 🙂 Tökéletes! btw – iTerm2 az Oh My Zsh-szel. Valójában 3 tökéletes válasz van. Ez a @jes ú s-carrera és a kiválasztott válasz. Az Ön beállításaitól és preferenciáitól függ.

Válasz

A Milyen testreszabásokat hajtott végre a shell profilján a termelékenység növelése érdekében? , én ezt így csinálom:

# make a directory and cd to it mcd() { test -d "$1" || mkdir "$1" && cd "$1" } 

ez azt jelenti, hogy akkor is működik, ha a könyvtár már létezik.

Megjegyzések

  • A -p opció az mkdirhez elnyomja a hibákat.
  • Az mcd már létező parancs. Bár ‘ csak példát mondtál, én magam használtam, mivel ‘ sa mkcd-nél rövidebb betű.
  • @Dharmit Shah: Mi a létező mcd parancs? Melyik csomag vagy projekt adja ezt a parancsot?
  • Az mtools biztosítja az mcd parancsot. Man oldala a következőt mondja: ” Az mcd paranccsal megváltoztathatja az mtools munkakönyvtárát az MS-DOS lemezen. ”

Válasz

Vagy létrehozhat egy rövid változót menet közben, és kétszer is használhatja x = longproject ; mkdir $x ; cd $x – ami bevallom, még mindig hosszabb, mint egy shellscript függvény használata 🙂

Válasz

Ez egy egyszerű dolog egy bash szkriptben / függvényben. Létrehoztam egy nagyon olvasható és kellően dokumentált szkripteket tartalmazó oktatóanyagot, amely Linux és MacOS rendszereken egyaránt működik (ez a jövőben is fennmarad).

A cél az oktatóanyag összetettsége: a célzott közönség számára írva az egyetlen előfeltétel, hogy a felhasználó impulzusokkal rendelkezzen, és tudjon angolul olvasni, ezért kérjük, adjon visszajelzést, ha segítségre van szüksége.

https://github.com/craigopie/shellscripts

 mcdir() { if [ $# -eq 0 ] || [ $1 = "-h" ] || [ $1 = "--help" ] then echo "Usage: [option...] {directory}" echo " -p, --path Create all directories in path " echo " -h, --help Shows this helpful information " echo return 0 fi ## create directory with a path if [ $1 = "-p" ] || [ $1 = "--path" ] then mkdir -p "$2" &>/dev/null if [ $? -gt 0 ] then echo "There was a problem creating your directory." return 1 fi cd "$2" &>/dev/null if [ $? -gt 0 ] then echo "Unable to change into that directory." return 1 fi return 0 fi ## create directory in this location mkdir "$1" &>/dev/null if [ $? -gt 0 ] then echo "There was a problem creating your directory." return 1 fi cd "$1" &>/dev/null if [ $? -gt 0 ] then echo "Unable to change into that directory." return 1 fi return 0 } export -f mcdir  

Ennek telepítéséhez kettő van opciók:

  • Először a függvény hozzáadása a .bashrc fájlhoz.
  • A második a fájl hozzáadása az útvonalhoz majd forrja a fájlt a .bash_profile fájlba.

Ismételten a README fájl részletesen leírja, hogyan kell ezt megtenni.

Sok szerencsét!

Válasz

Itt van egy apró változat, amelyet érdemes megemlíteni:

function mkdir() { local dir=$1 command mkdir "$dir" && cd "$dir" } 

Add hozzá ezt a yo-hoz ur ~/.bash_profile és ezután használhatja a mkdir t a szokásos módon (ha egyszer “ve source” d it), kivéve, hogy most a fenti függvényt fogja futtatni, nem pedig a szokásos mkdir parancsot.

Megjegyzés: ez nem érvényesíti az elfogadott Gilles válasza , de bemutatja, hogyan lehet (hatékonyan) felülbírálni a beépítetteket.

dokumentumok (kissé átfogalmazva):

command mkdir [args] fut mkdir args mellett, figyelmen kívül hagyva minden mkdir nevű shell funkciót. Csak a shellbe épített parancsokat vagy a PATH keresésével talált parancsokat hajtják végre. Ha van egy héjfüggvény, amelynek neve: ls, a command ls futtatása a függvényen belül végrehajtja a ls a függvény rekurzív meghívása helyett

Úgy gondolom, hogy a builtin hasonló eredményt ér el, mint a command.

Megjegyzések

  • feltétlenül idézzen $dir
  • @Jeff, egyetértett, de az elfogadott válasz tartalmazza az összes érvényesítést, amire szüksége lehet.Én ‘ m csak bemutatom az command alternatívaként való használatát.

Válasz

Segítő függvény hozzáadása a BASH, ZSH vagy KSH

mkcd parancs létrehozásához a környezetében a egy sor

echo -e "mkcd() {\n mkdir -p "$1" && cd $_\n}" >> ~/.${0//-/}rc && . ~/.${0//-/}rc 

Válasz

Ha Oh-my-zsh-t használ , a take parancs elvégzi a trükköt. Vessen egy pillantást a csalólapra .

Válasz

Csak automatizálta a fenti válaszokat, és egyszeri futtatható parancsfájlt készített:

fun=" mkcd () { mkdir -p -- "$1" && cd -P -- "$1" }" echo "$fun" >> ~/.bashrc 

Csak másolja ezt egy új fájlba mkcd.sh és futtassa csak egyszer a terminálban bash mkcd.sh által. Ezután hajtsa végre a source ~/.bashrc parancsot, hogy működjön az aktuális munkamenetben.

Ezek után létrehozhatja a mkcd some_dir parancsot. és írja be közvetlenül abba a könyvtárba.

Megjegyzések

  • Javasoljuk, hogy írjon egy szkriptet (egy fájlba), amelynek egyetlen célja a ~/.bashrc fájl (a már adott válaszsal)? És hogyan javasolja ennek a mkcd.sh szkriptnek a létrehozását? Szerkesztővel talán? Ez több munkának tűnik, mint pusztán a ~/.bashrc szerkesztése. Milyen előnye van ennek az elfogadott válaszhoz képest? …………………………………………………………………………………… P.S. Ez kudarcot vall a kérdések idézése miatt, ami azt mondja nekem, hogy még maga sem próbálta ki.
  • Sajnálom, hogy azt mondom, de igen, ahogy válaszomban írtam, a fenti válaszokat használtam. Valóban működik. Ha nem hisz nekem ‘, próbálja ki. És arról, hogy nem próbálkoztam, a mai napomat arra használtam, hogy ilyen szkripteket írjak bash-ba és pythonba.
  • Megpróbáltam, amit írtál. nem működik.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük