Jeg gjentar meg mye av:
mkdir longtitleproject cd longtitleproject
Er det en måte å gjøre det på en linje uten å gjenta katalognavnet? Jeg er her.
Kommentarer
Svar
Dette er one-liner du trenger. Ingen annen konfigurasjon nødvendig:
mkdir longtitleproject && cd $_
$_
variabelen, i bash, er det siste argumentet som ble gitt til forrige kommando. I dette tilfellet er navnet på katalogen du nettopp opprettet. Som forklart i 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.
Bruk cd $_
for å hente det siste argumentet ment for forrige kommando i stedet for cd !$
fordi cd !$
gir det siste argumentet for forrige kommando i skallhistorikken :
cd ~/ mkdir folder && cd !$
du ender hjemme (eller ~ /)
cd ~/ mkdir newfolder && cd $_
du havner i ny mappe under hjemmet !! (eller ~ / ny mappe)
Kommentarer
- Hvorfor i all verden er dette ikke det aksepterte svaret
- @JSmyth Jeg er enig , dette er en one-liner som bruker native shell-funksjonalitet
- Jeg tror OP prøver å unngå å bruke de to kommandoene. Dette svaret er (nesten) like gyldig som å gjøre
mkdir foo && cd foo
, som ikke er ‘ t hendig. - OP er ber om en en-linje som ikke ‘ ikke krever å gjenta katalognavnet, og dette er det
- Ved oppstemningene er det ‘ er tydelig at mange mennesker finner dette svaret nyttig. Jeg ‘ Jeg oppgir hvorfor jeg ikke ‘ ikke valgte dette svaret: Jeg ‘ jeg er veldig sannsynligvis feil
&& cd $_
siden tastene er så langt borte fra hjemmet, så selv om det er teknisk riktig, er det ‘ ikke ergonomisk. Jeg setter pris på det ‘ er ikke miljøavhengig, og det er ‘ nyttig å vite. Takk!
Svar
Det er ingen innebygd kommando, men du kan enkelt skrive en funksjon som kaller mkdir
deretter cd
:
mkcd () { mkdir "$1" cd "$1" }
Sett denne koden i ~/.bashrc
-filen din (eller ~/.kshrc
for ksh-brukere, eller ~/.zshrc
for zsh-brukere). Den definerer en funksjon kalt mkcd
. "$1"
vil bli erstattet av argumentet til funksjonen når du kjører den.
Denne enkle versjonen har flere mangler:
- Du kan ikke opprette en kjede av underkataloger på en gang. Fiks: Gi alternativet
-p
tilmkdir
. (Dette kan være ønskelig, eller ikke, da det øker risikoen for at en skrivefeil ikke blir oppdaget, f.eks.mkcd mydierctory/newsub
vil gjerne skapemydierctory
ogmydierctory/newsub
når du mente å lagenewsub
inne i eksisterendemydirectory
.) - Hvis argumentet begynner med
-
men ikke «t bare-
, så vilmkdir
ogcd
tolke det som et alternativ. Hvis det bare er-
, vilcd
tolke det slik at det betyr$OLDPWD
. det «s+
etterfulgt av 0 eller flere sifre, vilcd
i zsh tolke det som en indeks i katalogstakken. Du kan fikse det første problemet, men ikke de to andre, ved å sende--
før argumentet. Du kan løse alle disse problemene ved å forhåndsstille./
til argumentet hvis det er en relativ bane. -
mkdir
følger ikkeCDPATH
, mencd
gjør det, så hvis du har sattCDPATH
til en verdi som ikke begynner med.
(en riktignok noe uvanlig konfigurasjon), så kancd
føre deg til en annen katalog enn den som nettopp ble opprettet.Forhåndsbetaling av./
til relative stier løser dette¹ (det fører til atCDPATH
ignoreres). - Hvis
mkdir
mislykkes, den prøver å utførecd
. Fix: bruk&&
for å skille de to kommandoene.
Fortsatt ganske enkelt:
mkcd () { case "$1" in /*) :;; *) set -- "./$1";; esac mkdir -p "$1" && cd "$1" }
Denne versjonen har fremdeles potensial til å få cd
til å gå inn i en annen katalog enn den at mkdir
nettopp er opprettet i ett kantstilfelle: hvis argumentet til mkcd
inneholder ..
og går gjennom en symbolsk lenke. For eksempel hvis den nåværende katalogen er /tmp/here
og mylink
er en symbolsk lenke til /somewhere/else
, deretter skaper mkdir mylink/../foo
/somewhere/else/foo
mens cd mylink/../foo
endres til foo
. Det er ikke nok å lete etter symbolske lenker i argumentet, fordi skallet også sporer symbolske lenker i sin egen nåværende katalog, så cd /tmp/mylink; mkdir ../foo; cd ../foo
endres ikke til den nye katalogen (/somewhere/else/foo
) men inn i /tmp/foo
. En løsning på dette er å la cd
innebygd løse alt ..
banekomponenter først (det er ikke fornuftig å bruke foo/..
hvis foo
ikke » t eksisterer, så mkdir
trenger aldri å se noen ..
).
Vi kommer til dette robuste hvis det er litt blodig versjon:
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 }
(Øvelse: hvorfor bruker jeg en subshell for første cd
samtale?)
Hvis mkdir mislykkes, vil jeg være sikker på at du ikke endrer den nåværende katalogen. Å bytte tilbake med cd – eller $ OLDPWD er ikke bra nok hvis skallet ikke har det tillatelse til å endre til sin nåværende katalog. Å ringe til cd-oppdateringer OLDPWD, så vi vil bare gjøre det en gang (eller gjenopprette OLDPWD).
Det er også mindre spesialiserte måter å slippe å skrive inn ordet fra forrige linje:
- Skriv
cd
, deretter Esc . (eller Alt + . ) for å sette inn det siste argumentet fra forrige kommando. -
cd !$
utførercd
på det siste argumentet i forrige kommando. - Trykk Opp for å hente den forrige kommandolinjen, og rediger den å endre
mkdir
tilcd
.
¹ pass imidlertid på at det fungerer ikke i ksh93 siden u+
versjonen , fast i 93u + m / 1.0.0-alpha + d1483150 2021-01-05
Kommentarer
- Takk! Esc. virker mest praktisk for meg, gjør nøkkelsekvensen har noen spesielle m spiser?
- Det ‘ er bare Bash (og arvet fra
ksh
, og fungerer også izsh
) sekvens for » gjenta siste ord i forrige kommando «. Jeg bruker det ganske ofte. - @Gilles I ‘ Jeg begynner å tenke at » Gilles » kontoen deles faktisk av et ekspertpanel. 😉
- @StephaneChazelas
/a/b/..//
ville faktisk fungert, men ikke/a/b/../c
. Fikset. Jeg ‘ har stilt spørsmålet til et bredere publikum. -
mkcd() { mkdir -p "$1" && cd "$1"; }
virker ikke ‘ t å være et problem i (min forekomst av) 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
(inkluderer oppsettet og) viser/tmp/here/foo
som er det som ble opprettet (og det jeg forventet).bash
feilaktig oppretter og endrer til/var/tmp/somewhere/foo
.
Svar
Det ville aldri ha skjedd meg å skrive opp denne oppførselen fordi jeg skriver inn følgende på nærtidsbasis …
$ mkdir someDirectory<ENTER> $ cd !$
der bash erstatter !$
med det siste ordet i siste linje; dvs. det lange katalognavnet du skrev inn.
I tillegg er fullføring av filnavn din venn i slike situasjoner. Hvis den nye katalogen din var den eneste filen i mappen, ville en rask dobbel TAB gi deg den nye katalogen uten å gå inn på nytt.
Selv om det er kult at bash tillater deg å skript opp slike vanlige oppgaver som de andre svarene antyder, jeg synes det er bedre å lære redigeringsfunksjonene for kommandolinjen som bash har å tilby, slik at når du jobber på en annen maskin, mangler du det syntaktiske sukkeret som dine tilpassede skript gir.
Kommentarer
- Er det et bra sted å finne ut om de viktigste bash-særegenheter som denne?
- @ dominicbri7 Generelt kommer under » bash kommandolinjeredigering » Googling samme gir følgende som et toppresultat web.mit.edu/gnu/doc/html/features_7.html Mer spesifikt er! $ et eksempel på en Word Designator, se gnu.org/software /bash/manual/bashref.html#Word-Designators
Svar
Hvis du bruker Oh My Zsh, there «sa command called take som gjør akkurat dette. Det vil se ut som dette.
take myfolder
Jeg fant denne faktisk ved et uhell. Jeg så bare og den står oppført på dette cheatsheat fra Oh My Zsh GitHub-wiki. Det er ganske nyttig kommando, og tilsynelatende veldig enkelt å lage deg selv.
Kommentarer
- Jeg visste aldri om
take
🙂 Perfekt! btw – iTerm2 med Oh My Zsh. Det er faktisk 3 perfekte svar her. Denne, den av @jes ú s-carrera, og det valgte svaret. Avhenger av oppsettet og preferansen din.
Svar
I henhold til Hvilke tilpasninger har du gjort på skallprofilen din for å øke produktiviteten? , slik gjør jeg det:
# make a directory and cd to it mcd() { test -d "$1" || mkdir "$1" && cd "$1" }
det betyr at det også fungerer hvis katalogen allerede eksisterer.
Kommentarer
-
-p
alternativet til mkdir vil undertrykke feil. - mcd er en allerede eksisterende kommando. Selv om du ‘ nettopp har gitt et eksempel, brukte jeg den selv som den ‘ en bokstav kortere enn mkcd.
- @Dharmit Shah: Hva er den eksisterende
mcd
-kommandoen? Hvilken pakke eller prosjekt gir denne kommandoen? - mtools gir mcd-kommandoen. Hans manside sier » MCD-kommandoen brukes til å endre mtools arbeidskatalog på MS-DOS-disken. »
Svar
Eller du kan bare lage en kort variabel på farten og bruke den to ganger x = longproject ; mkdir $x ; cd $x
– som jeg innrømmer er fortsatt lenger enn å bruke en shellscript-funksjon 🙂
Svar
Dette er en enkel ting å gjøre i et bash-skript / -funksjon. Jeg opprettet en veldig lesbar og tilstrekkelig dokumentert opplæring inkludert skript som fungerer på både Linux og MacOS (dette vil også bli opprettholdt i fremtiden).
Målet mitt for opplæringskompleksiteten er: skrevet for et målrettet publikum med de eneste forutsetningene for at brukeren har en puls og kan lese engelsk, så vennligst gi tilbakemelding hvis du trenger hjelp.
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
For å installere dette har du to alternativer:
- Først er å legge til funksjonen i
.bashrc
-filen. - Den andre er å legge til filen i banen og kild filen i
.bash_profile
-filen.
Igjen, README-filen er veldig detaljert om hvordan du gjør dette.
Lykke til!
Svar
Her «er en liten variant som er verdt å nevne:
function mkdir() { local dir=$1 command mkdir "$dir" && cd "$dir" }
Legg dette til deg ur ~/.bash_profile
og du kan deretter bruke mkdir
som normalt (når du først har source
» d it), bortsett fra nå, vil den kjøre funksjonen ovenfor i stedet for standard mkdir
-kommandoen.
Merk, dette validerer ikke inndata i henhold til den aksepterte svar av Gilles , men viser hvordan du (effektivt) kan overstyre innebygde.
Fra dokumenter (parafraserer litt):
command mkdir [args]
kjørermkdir
medargs
ignorerer en hvilken som helst skallfunksjon med navnetmkdir
. Bare shell-innebygde kommandoer eller kommandoer funnet ved å søke i PATH blir utført. Hvis det er en skallfunksjon kaltls
, kjørercommand ls
i funksjonen den eksterne kommandoenls
i stedet for å ringe til funksjonen rekursivt
Jeg tror builtin
oppnår et lignende resultat som command
.
Kommentarer
- du bør absolutt sitere
$dir
- @Jeff, enig, men det aksepterte svaret har all validering man trenger.Jeg ‘ presenterer nettopp bruken av
command
som et alternativ.
Svar
Legge til hjelperfunksjon i BASH, ZSH eller KSH
Opprett mkcd
kommando til miljøet ditt i en linje
echo -e "mkcd() {\n mkdir -p "$1" && cd $_\n}" >> ~/.${0//-/}rc && . ~/.${0//-/}rc
Svar
Hvis du bruker Oh-my-zsh , take
-kommandoen gjør susen. Ta en titt på jukseark .
Svar
Bare automatiserte svarene ovenfor og laget et engangs kjørbart skript:
fun=" mkcd () { mkdir -p -- "$1" && cd -P -- "$1" }" echo "$fun" >> ~/.bashrc
Bare kopier dette i en ny fil mkcd.sh
og kjør den bare en gang i terminalen av bash mkcd.sh
. Utfør deretter source ~/.bashrc
for å få det til å fungere i den aktuelle økten.
Etter dette kan du bruke mkcd some_dir
for å opprette og skriv direkte inn i den katalogen.
Kommentarer
- Du foreslår at du skriver et skript (i en fil) hvis eneste formål er å legge til
~/.bashrc
fil (med et svar som allerede er gitt)? Og hvordan foreslår du at du oppretter dettemkcd.sh
skriptet? Med en redaktør, kanskje? Dette ser ut som mer arbeid enn bare redigering av~/.bashrc
. Hvilken fordel har dette fremfor det aksepterte svaret? ………………………………………………………………………… P.S. Dette vil mislykkes på grunn av sitater, noe som forteller meg at du ikke engang har prøvd det selv. - Jeg beklager å si, men ja, da jeg skrev i svaret mitt, brukte jeg svarene ovenfor. Det fungerer. Hvis du ikke tror ‘, prøv det. Og om ikke å prøve, brukte jeg hele dagen til å skrive slike skript i bash og python i dag.
- Jeg prøvde det du skrev. Det fungerer ikke .
mcd
fra unix.stackexchange.com/questions/6628/…mkdir longtitleproject
og derettercd !^