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 amkdir
. (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étremydierctory
ésmydierctory/newsub
amikornewsub
-et akartál létrehozni a meglévőmydirectory
.) - Ha az argumentum
-
-vel kezdődik, de nem “t csak-
, majdmkdir
éscd
opcióként értelmezi. Ha csak-
, akkor azcd
ú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
, decd
, tehát ha beállította aCDPATH
olyan értékre, amely nem “kezdődik.
-nel (kétségkívül kissé szokatlan konfigurációval), akkor azcd
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¹ (aCDPATH
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 azcd
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 azsh
) ” 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). Amkdir -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). Abash
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]
futmkdir
args
mellett, figyelmen kívül hagyva mindenmkdir
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
, acommand ls
futtatása a függvényen belül végrehajtja als
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 amkcd.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.
mcd
a következőtől: unix.stackexchange.com/questions/6628/…mkdir longtitleproject
majdcd !^