Onko olemassa yhden linjan linjaa, jonka avulla voin luoda hakemiston ja siirtyä siihen samanaikaisesti?

Toistan olevani toistamassa paljon:

 mkdir longtitleproject cd longtitleproject  

Onko mahdollista tehdä se yhdellä rivillä toistamatta hakemiston nimeä? Olen täällä.

Kommentit

Vastaa

Tämä on tarvitsemasi yhden linjan. Muita määrityksiä ei tarvita:

mkdir longtitleproject && cd $_ 

Muuttuja $_, bash, on edelliselle komennolle annettu viimeinen argumentti. Tässä tapauksessa juuri luomasi hakemiston nimi. Kuten selitettiin man bash:

_ 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. 

Käytä cd $_ viimeisen argumentin hakemiseen edellisen komennon cd !$ sijasta, koska cd !$ antaa edellisen komennon viimeisen argumentin shell-historiaan :

cd ~/ mkdir folder && cd !$ 

pääset kotiin (tai ~ /)

cd ~/ mkdir newfolder && cd $_ 

pääset uuteen kansioon kodin alla! (tai ~ / newfolder)

Kommentit

  • Miksi maapallolla tämä ei ole hyväksytty vastaus
  • @JSmyth Olen samaa mieltä , tämä on yksi linja, joka käyttää natiivia kuoritoimintoa
  • Mielestäni OP yrittää välttää näiden kahden komennon käyttöä. Tämä vastaus on (melkein) yhtä pätevä kuin tekemällä mkdir foo && cd foo, joka ei ole ’ t kätevä.
  • OP on yhden linjan pyytäminen, joka ’ ei vaadi toistamaan hakemiston nimeä, ja tämä on se.
  • Ylääänten mukaan se ’ ilmeisesti monet ihmiset pitävät tätä vastausta hyödyllisenä. ’ Ll ilmoitan, miksi en valinnut ’ t valitsemalla tätä vastausta: I ’ m todennäköisesti kirjoittaa väärin && cd $_, koska näppäimet ovat niin kaukana kotirivistä, joten vaikka teknisesti oikein, se ’ ei ole ergonominen. Arvostan sitä, että se ’ ei ole riippuvainen ympäristöstä ja se on ’ hyödyllinen tietää. Kiitos!

Vastaa

Sisäänrakennettua komentoa ei ole, mutta voit helposti kirjoittaa funktion, joka kutsuu mkdir ja sitten cd:

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

Laita tämä koodi ~/.bashrc -tiedostosi (tai ~/.kshrc ksh-käyttäjille tai ~/.zshrc zsh-käyttäjille). Se määrittelee funktion nimeltä mkcd. "$1" korvataan funktion argumentilla, kun suoritat sen.

Tällä yksinkertaisella versiolla on useita vikoja:

  • Et voi luoda alihakemistoketjua kerralla. Korjaus: välitä -p -vaihtoehto mkdir. (Tämä voi olla tai ei olla toivottavaa, koska se lisää riskiä, että kirjoitusvirhe jää huomaamatta, esim. mkcd mydierctory/newsub luo mielellään mydierctory ja mydierctory/newsub, kun aiot luoda newsub olemassa oleva mydirectory.)
  • Jos argumentti alkaa -, mutta ei ”t vain -, sitten mkdir ja cd tulkitsevat sen vaihtoehtona. Jos se on vain -, niin cd tulkitsee sen tarkoittavan $OLDPWD. se ”s +, jota seuraa 0 tai enemmän numeroita, sitten zsh: n cd tulkitsee sen hakemistopinon indeksinä. Voit korjata ensimmäisen ongelman, mutta et kahta muuta, välittämällä -- ennen argumenttia. Voit korjata kaikki nämä ongelmat valmistelemalla ./ argumenttiin, jos se on suhteellinen polku.
  • mkdir ei seuraa CDPATH, mutta cd seuraa, joten jos olet asettanut CDPATH arvoon, joka ei ala t . (tosin jonkin verran epätavallinen kokoonpano), niin cd saattaa viedä sinut toiseen hakemistoon kuin juuri luotu../ -valmistelu suhteellisille poluille korjaa tämän¹ (se aiheuttaa CDPATH -ominaisuuden ohittamisen).
  • Jos mkdir epäonnistuu, se yrittää suorittaa cd. Korjaus: käytä komentoja && erottaaksesi nämä kaksi komentoa.

Silti melko yksinkertainen:

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

Tällä versiolla on edelleen mahdollisuus saada cd siirtymään eri hakemistoon kuin yksi että mkdir juuri luotu yhdessä reunatapauksessa: jos mkcd-argumentti sisältää .. ja kulkee symbolisen linkin läpi. Esimerkiksi, jos nykyinen hakemisto on /tmp/here ja mylink on symbolinen linkki osoitteeseen /somewhere/else , sitten mkdir mylink/../foo luo /somewhere/else/foo, kun taas cd mylink/../foo muuttuu foo. Symbolisten linkkien etsiminen argumentista ei riitä, koska kuori seuraa myös symbolisia linkkejä omassa nykyisessä hakemistossaan, joten cd /tmp/mylink; mkdir ../foo; cd ../foo ei muutu uuteen hakemistoon (/somewhere/else/foo), mutta /tmp/foo. Korjaus tähän on antaa sisäänrakennetun cd ratkaista kaikki .. polun komponentit ensin (ei ole järkevää käyttää foo/.. jos foo ei ” T on olemassa, joten mkdir ei koskaan tarvitse nähdä mitään ..).

Tulemme tähän vankkaan, joskin hieman ihanaan versio:

 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 }  

(Harjoitus: miksi käytän alikuorta ensimmäisessä cd puhelu?)

Jos mkdir epäonnistuu, haluan olla varma, ettet vaihda nykyistä hakemistoa. Paluu CD: llä tai $ OLDPWD: llä ei ole tarpeeksi hyvä, jos kuoressa ei ole lupa vaihtaa nykyiseen hakemistoon. CD-päivitysten kutsuminen myös OLDPWD: ksi, joten haluamme tehdä sen vain kerran (tai palauttaa OLDPWD).


On myös vähemmän erikoistuneita tapoja ei tarvitse kirjoittaa sanaa edelliseltä riviltä:

  • Kirjoita cd ja sitten Esc . (tai Alt + . ) lisätäksesi edellisen komennon viimeisen argumentin.
  • cd !$ suorittaa cd edellisen komennon viimeisen argumentin kohdalla.
  • Paina Ylös saadaksesi edellisen komentorivin muokkaamaan sitten muuttaa mkdir muotoon cd.

¹ varo kuitenkin se ei toimi ksh93: ssa, koska versio u+ , korjattu 93u + m / 1.0.0-alfassa + d1483150 2021-01-05

Kommentit

  • Kiitos! Esc näyttää minulle mukavimmalta, tekeekö avainsarja ole erityisiä m
  • Se ’ on vain Bash (ja peritty ksh: stä ja toimii myös zsh) jakso ” toista edellisen komennon viimeinen sana ”. Käytän sitä melko usein.
  • @Gilles I ’ aloin ajatella, että ” Gilles ” tili on tosiasiallisesti jaettu asiantuntijapaneelissa. 😉
  • @StephaneChazelas /a/b/..// todella toimisi, mutta ei /a/b/../c. Kiinteä. Olen ’ laatinut kysymyksen laajemmalle yleisölle.
  • mkcd() { mkdir -p "$1" && cd "$1"; } ei ’ ei näytä olevan ongelma zsh: ssä (esimerkiksi). 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 (sisältää asetukset ja) näyttää /tmp/here/foo, mikä on luotu (ja mitä odotin). bash luo virheellisesti /var/tmp/somewhere/foo.

Vastaa

Minulle ei olisi koskaan tullut mieleen skriptaamaan tätä käyttäytymistä, koska annan seuraavan tunnin välein …

$ mkdir someDirectory<ENTER> $ cd !$ 

missä bash korvaa !$ ystävällisesti viimeisen rivin viimeisellä sanalla; ts. kirjoittamasi pitkä hakemistonimi.

Lisäksi tiedostonimen täydentäminen on ystäväsi tällaisissa tilanteissa. Jos uusi hakemisto oli ainoa kansiossa oleva tiedosto, nopea kaksois SARKAIN antaisi sinulle uuden hakemiston kirjoittamatta sitä uudelleen.

Vaikka se on hienoa, bash antaa sinun komentosarjan luomiseksi sellaisia yleisiä tehtäviä kuin muut vastaukset viittaavat siihen, että mielestäni on parempi oppia komentorivin muokkausominaisuudet, joita bashilla on tarjottavanaan niin, että työskennellessäsi toisella koneella, et kadota mukautettujen komentosarjojesi tarjoamaa syntaktista sokeria.

kommentit

  • Onko olemassa hyvä paikka oppia tärkeimmistä tämänkaltaisista bash-oudoista?
  • @ dominicbri7 Yleensä tulee alle ” bash-komentorivin muokkaus ” Google-haku antaa saman lopputuloksena > web.mit.edu/gnu/doc/html/features_7.html Tarkemmin sanottuna! $ on esimerkki Word Designatorista, katso gnu.org/software /bash/manual/bashref.html#Word-Designators

Vastaa

Jos käytät Voi Zsh, siellä on komento nimeltä ota , joka tekee juuri tämän. Se näyttäisi tältä.

take myfolder 

Löysin tämän vahingossa. Katselin juuri sitä ja se on luettelossa tämä huijausliike Oh My Zsh GitHub -wikistä. Se on melko hyödyllinen komento, ja itsesi luominen on ilmeisesti erittäin helppoa.

Kommentit

  • En koskaan tiennyt take 🙂 Täydellinen! btw – iTerm2 Oh My Zsh: n kanssa. Tässä on oikeastaan 3 täydellistä vastausta. Tämä on @jes ú s-carreran ja valittu vastaus. Riippuu asetuksistasi ja asetuksistasi.

Vastaa

Kuten Mitä mukautuksia olet tehnyt shell-profiilissasi tuottavuuden lisäämiseksi? , näin teen sen:

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

se tarkoittaa, että se toimii myös, jos hakemisto on jo olemassa.

Kommentit

  • -p -vaihtoehto mkdirille tukahduttaa virheet.
  • mcd on jo olemassa oleva komento. Vaikka olet ’ antanut juuri esimerkin, käytin sitä itse nimellä ’ sa lyhyempi kirjain kuin mkcd.
  • @Dharmit Shah: Mikä on olemassa oleva komento mcd? Mikä paketti tai projekti antaa tämän komennon?
  • mtools tarjoaa mcd-komennon. Sen man-sivulla lukee ” Mcd-komentoa käytetään muuttamaan MS-DOS-levyn mtools-työhakemisto. ”

Vastaa

Tai voit luoda vain lyhyen muuttujan lennossa ja käyttää sitä kahdesti x = longproject ; mkdir $x ; cd $x – joka on mielestäni vielä pidempi kuin shell-funktion käyttö 🙂

Answer

Tämä on yksinkertainen asia tehdä bash-komentosarjassa / -funktiossa. Loin hyvin luettavan ja riittävän dokumentoidun opetusohjelman, joka sisältää komentosarjoja, jotka toimivat sekä Linuxissa että MacOS: ssa (tämä säilytetään myös tulevaisuudessa).

Tavoitteenani opetusohjelman monimutkaisuus on: kirjoitettu kohdistetulle yleisölle Ainoat edellytykset käyttäjälle ovat pulssi ja pystyy lukemaan englantia, joten anna palautetta, jos tarvitset apua.

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  

Tämän asentamiseen sinulla on kaksi vaihtoehdot:

  • Ensin lisätään funktio .bashrc -tiedostoon.
  • Toinen on lisätä tiedosto polkusi ja lähde sitten tiedosto .bash_profile -tiedostoon.

README-tiedosto on jälleen hyvin yksityiskohtainen miten se tehdään.

Onnea!

Vastaa

Tässä on pieni mainitsemisen arvoinen muunnelma:

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

Lisää tämä sinulle ur ~/.bash_profile ja voit sitten käyttää mkdir normaalisti (kerran ”ve source” d se), paitsi että nyt se suorittaa yllä olevan toiminnon tavallisen mkdir -komennon sijaan.

Huomaa, että tämä ei vahvista syötettä hyväksytyn Gillesin vastaus , mutta osoittaa kuinka voit (tehokkaasti) ohittaa sisäiset rakennukset.

dokumentit (muotoilevat hieman):

command mkdir [args] suoritetaan mkdir args ohittaen kaikki kuoritoiminnot nimeltä mkdir. Ainoastaan shell-sisäiset komennot tai PATH-haulla löydetyt komennot suoritetaan. Jos on kuoritoiminto nimeltä ls, toiminnon command ls suorittaminen suorittaa ulkoisen komennon ls funktion rekursiivisen kutsumisen sijaan

Uskon, että builtin saavuttaa samanlaisen tuloksen kuin command.

Kommentit

  • sinun tulee ehdottomasti lainata $dir
  • @Jeff, suostunut, mutta hyväksytyllä vastauksella on kaikki tarvitsemansa vahvistukset.I ’ m esitän vain vaihtoehdon command käytön.

Vastaa

Aputoiminnon lisääminen BASH, ZSH tai KSH

Luo komento mkcd ympäristöön yksi rivi

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

Vastaa

Jos käytät Oh-my-zsh , take -komento tekee temppun. Katso -huijausarkki .

Vastaa

Vain automatisoi yllä olevat vastaukset ja teki kertakäynnistettävän komentosarjan:

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

Kopioi tämä vain uuteen tiedostoon mkcd.sh ja suorita se vain kerran terminaalissa bash mkcd.sh. Suorita sitten source ~/.bashrc, jotta se toimii nykyisessä istunnossa.

Tämän jälkeen voit luoda mkcd some_dir -palvelun luomalla ja kirjoita suoraan tuohon hakemistoon.

Kommentit

  • Ehdotat, että kirjoitat komentosarjan (tiedostoon), jonka ainoa tarkoitus on liittää ~/.bashrc tiedosto (vastauksella, joka on jo annettu)? Ja miten ehdotat tämän mkcd.sh -koodin luomista? Ehkä toimittajan kanssa? Tämä näyttää enemmän työltä kuin vain muokkaamasta ~/.bashrc. Mitä etua sillä on hyväksyttyyn vastaukseen nähden? …………………………………………………………………………………… P.S. Tämä epäonnistuu lainausmerkkien takia, mikä kertoo minulle, ettet ole edes kokeillut sitä itse.
  • Olen pahoillani sanoa, mutta kyllä, kun kirjoitin vastaukseeni, käytin yllä olevia vastauksia. Se toimii. Jos et ’ usko minua, kokeile sitä. Enkä yrittänyt, kirjoitin koko päiväni kirjoittamaan tällaisia komentosarjoja bashiin ja pythoniin tänään.
  • Yritin kokeillut kirjoittamaasi. Se ei toimi .

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *