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
-vaihtoehtomkdir
. (Tämä voi olla tai ei olla toivottavaa, koska se lisää riskiä, että kirjoitusvirhe jää huomaamatta, esim.mkcd mydierctory/newsub
luo mielelläänmydierctory
jamydierctory/newsub
, kun aiot luodanewsub
olemassa olevamydirectory
.) - Jos argumentti alkaa
-
, mutta ei ”t vain-
, sittenmkdir
jacd
tulkitsevat sen vaihtoehtona. Jos se on vain-
, niincd
tulkitsee sen tarkoittavan$OLDPWD
. se ”s+
, jota seuraa 0 tai enemmän numeroita, sitten zsh: ncd
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 seuraaCDPATH
, muttacd
seuraa, joten jos olet asettanutCDPATH
arvoon, joka ei ala t.
(tosin jonkin verran epätavallinen kokoonpano), niincd
saattaa viedä sinut toiseen hakemistoon kuin juuri luotu../
-valmistelu suhteellisille poluille korjaa tämän¹ (se aiheuttaaCDPATH
-ominaisuuden ohittamisen). - Jos
mkdir
epäonnistuu, se yrittää suorittaacd
. 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 !$
suorittaacd
edellisen komennon viimeisen argumentin kohdalla. - Paina Ylös saadaksesi edellisen komentorivin muokkaamaan sitten muuttaa
mkdir
muotooncd
.
¹ 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öszsh
) 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]
suoritetaanmkdir
args
ohittaen kaikki kuoritoiminnot nimeltämkdir
. Ainoastaan shell-sisäiset komennot tai PATH-haulla löydetyt komennot suoritetaan. Jos on kuoritoiminto nimeltäls
, toiminnoncommand ls
suorittaminen suorittaa ulkoisen komennonls
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änmkcd.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 .
mcd
lähettäjältä unix.stackexchange.com/questions/6628/…mkdir longtitleproject
sittencd !^