Jeg gentager en masse:
mkdir longtitleproject cd longtitleproject
Er der en måde at gøre det på en linje uden at gentage katalognavnet? Jeg er på bash her.
Kommentarer
Svar
Dette er den ene linie, du har brug for. Ingen anden konfiguration nødvendig:
mkdir longtitleproject && cd $_
$_
variablen, i bash, er det sidste argument, der blev givet til den forrige kommando. I dette tilfælde er navnet på den mappe, du lige har oprettet. Som forklaret 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.
Brug cd $_
til at hente den sidste argu ment for den forrige kommando i stedet for cd !$
fordi cd !$
giver det sidste argument for forrige kommando i shellhistorikken :
cd ~/ mkdir folder && cd !$
du ender hjemme (eller ~ /)
cd ~/ mkdir newfolder && cd $_
du ender i ny mappe under hjemmet !! (eller ~ / ny mappe)
Kommentarer
- Hvorfor i alverden er denne ikke det accepterede svar
- @JSmyth Jeg er enig , dette er en one-liner, der bruger native shell-funktionalitet
- Jeg tror, at OP forsøger at undgå at bruge de to kommandoer. Dette svar er (næsten) lige så gyldigt som at gøre
mkdir foo && cd foo
, hvilket ikke er ‘ t praktisk. - OPen er beder om en one-liner, der ikke ‘ t kræver at gentage biblioteksnavnet, og det er det
- Ved opstemmerne er det ‘ er tydeligt, at mange mennesker finder dette svar nyttigt. Jeg ‘ Jeg angiver, hvorfor jeg ikke ‘ ikke valgte dette svar: Jeg ‘ er meget sandsynligvis forkert indtastet
&& cd $_
da tasterne er så langt væk fra hjemmet, så selvom det er teknisk korrekt, er det ‘ ikke ergonomisk. Jeg sætter pris på, at det ‘ ikke er miljøafhængigt, og det er ‘ nyttigt at vide. Tak!
Svar
Der er ingen indbygget kommando, men du kan nemt skrive en funktion, der kalder mkdir
derefter cd
:
mkcd () { mkdir "$1" cd "$1" }
Sæt denne kode i din ~/.bashrc
-fil (eller ~/.kshrc
til ksh-brugere eller ~/.zshrc
til zsh-brugere). Den definerer en funktion kaldet mkcd
. "$1"
erstattes af argumentet for funktionen, når du kører den.
Denne enkle version har flere mangler:
- Du kan ikke oprette en kæde af underkataloger på én gang. Fix: send indstillingen
-p
tilmkdir
. (Dette kan eller ikke være ønskeligt, da det øger risikoen for, at en tastefejl ikke bliver opdaget, f.eks.mkcd mydierctory/newsub
vil med glæde skabemydierctory
ogmydierctory/newsub
når du mente at oprettenewsub
inde i eksisterendemydirectory
.) - Hvis argumentet begynder med
-
men ikke “t bare-
, såmkdir
ogcd
fortolker det som en mulighed. Hvis det “bare er-
, fortolkercd
det til at betyde$OLDPWD
. det “s+
efterfulgt af 0 eller flere cifre, så fortolkercd
i zsh det som et indeks i biblioteksstakken. Du kan løse det første problem, men ikke de to andre, ved at sende--
før argumentet. Du kan løse alle disse problemer ved at forudse./
til argumentet, hvis det er en relativ sti. -
mkdir
følger ikkeCDPATH
, mencd
gør det, så hvis du har indstilletCDPATH
til en værdi, der ikke begynder med.
(en ganske vist usædvanlig konfiguration), så kancd
bringe dig til en anden mappe end den der lige blev oprettet.Forudbestemmelse af./
til relative stier løser dette¹ (det fårCDPATH
til at blive ignoreret). - Hvis
mkdir
mislykkes, det forsøger at udførecd
. Fix: Brug&&
til at adskille de to kommandoer.
Stadig ret simpelt:
mkcd () { case "$1" in /*) :;; *) set -- "./$1";; esac mkdir -p "$1" && cd "$1" }
Denne version har stadig potentialet til at få cd
til at gå ind i en anden mappe end den at mkdir
netop oprettet i en kant: hvis argumentet til mkcd
indeholder ..
og går gennem et symbolsk link. For eksempel, hvis den aktuelle mappe er /tmp/here
og mylink
er et symbolsk link til /somewhere/else
, derefter skaber mkdir mylink/../foo
/somewhere/else/foo
mens cd mylink/../foo
skifter til foo
. Det er ikke nok at lede efter symbolske links i argumentet, fordi skallen også sporer symbolske links i sin egen aktuelle mappe, så cd /tmp/mylink; mkdir ../foo; cd ../foo
skifter ikke til den nye mappe (/somewhere/else/foo
) men ind i /tmp/foo
. En løsning på dette er at lade cd
indbygget løse alt ..
stykomponenter først (det giver ikke mening at bruge foo/..
hvis foo
ikke ” t eksisterer, så mkdir
behøver aldrig at se nogen ..
).
Vi kommer til denne robuste, hvis den er lidt blodig version:
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 bruger jeg en subshell til den første cd
opkald?)
Hvis mkdir mislykkes, vil jeg være sikker på ikke at ændre den aktuelle bibliotek. At skifte tilbage med cd – eller $ OLDPWD er ikke god nok, hvis skallen ikke har det tilladelse til at skifte til den aktuelle mappe. Også at kalde cd-opdateringer OLDPWD, så vi vil kun gøre det en gang (eller gendanne OLDPWD).
Der er også mindre specialiserede måder for ikke at skulle indtaste ordet fra den forrige linje:
- Skriv
cd
, derefter Esc . (eller Alt + . ) for at indsætte det sidste argument fra den forrige kommando. -
cd !$
udførercd
på det sidste argument i den forrige kommando. - Tryk Op for at hente den forrige kommandolinje, og rediger den derefter at skifte
mkdir
tilcd
.
¹ pas dog på, at det virker ikke i ksh93, da u+
version , fast i 93u + m / 1.0.0-alpha + d1483150 2021-01-05
Kommentarer
- Tak! Esc. virker det mest bekvemme for mig, gør nøglesekvensen har nogen speciel m spiser?
- Det ‘ er bare Bash (og arvet fra
ksh
, og fungerer også izsh
) sekvens for ” Gentag sidste ord i forrige kommando “. Jeg bruger det ganske ofte. - @Gilles I ‘ Jeg begynder at tro, at ” Gilles ” konto deles faktisk af et ekspertpanel. 😉
- @StephaneChazelas
/a/b/..//
ville faktisk fungere, men ikke/a/b/../c
. Fast. Jeg ‘ har stillet spørgsmålet til et bredere publikum. -
mkcd() { mkdir -p "$1" && cd "$1"; }
virker ikke ‘ t synes at være et problem i (min forekomst af) 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 opsætningen og) viser/tmp/here/foo
hvilket er det, der blev oprettet (og hvad jeg forventede).bash
fejlagtigt opretter og ændrer fejlagtigt til/var/tmp/somewhere/foo
.
Svar
Jeg ville aldrig have tænkt mig at opskrive denne adfærd, fordi jeg indtaster følgende næsten hver time …
$ mkdir someDirectory<ENTER> $ cd !$
hvor bash venligt erstatter !$
med det sidste ord i den sidste linje; dvs. det lange biblioteksnavn, som du indtastede.
Derudover er filnavnafslutning din ven i sådanne situationer. Hvis din nye mappe var den eneste fil i mappen, ville en hurtig dobbelt TAB give dig den nye mappe uden at genindtaste den.
Selvom det er sejt, at bash tillader dig for at opskrive så almindelige opgaver, som de andre svar antyder, synes jeg det er bedre at lære de kommandolinjedigeringsfunktioner, som bash har at tilbyde, så når du arbejder på en anden maskine, mangler du det syntaktiske sukker, som dine brugerdefinerede scripts giver.
Kommentarer
- Er der et godt sted at finde ud af de vigtigste bash-quirks som denne?
- @ dominicbri7 Generelt kommer under ” redigering af bash-kommandolinje ” Googling samme giver følgende som et topresultat web.mit.edu/gnu/doc/html/features_7.html Mere specifikt er! $ et eksempel på en Word Designator se gnu.org/software /bash/manual/bashref.html#Word-Designators
Svar
Hvis du bruger Åh min Zsh, der er en kommando kaldet tag der gør nøjagtigt dette. Det ville se sådan ud.
take myfolder
Jeg fandt denne faktisk ved et uheld. Jeg kiggede bare, og den er anført på dette cheatsheat fra Oh My Zsh GitHub wiki. Det er en ganske nyttig kommando og tilsyneladende meget let at oprette dig selv.
Kommentarer
- Jeg vidste aldrig om
take
🙂 Perfekt! btw – iTerm2 med Oh My Zsh. Der er faktisk 3 perfekte svar her. Den ene, den af @jes ú s-carrera, og det valgte svar. Afhænger af din opsætning og præference.
Svar
I henhold til Hvilke tilpasninger har du foretaget på din shell-profil for at øge produktiviteten? , sådan gør jeg det:
# make a directory and cd to it mcd() { test -d "$1" || mkdir "$1" && cd "$1" }
det betyder, at det også fungerer, hvis biblioteket allerede findes.
Kommentarer
-
-p
mulighed for at mkdir vil undertrykke fejl. - mcd er en allerede eksisterende kommando. Selvom du ‘ lige har givet et eksempel, brugte jeg det selv som det ‘ et bogstav kortere end mkcd.
- @Dharmit Shah: Hvad er den eksisterende
mcd
kommando? Hvilken pakke eller projekt giver denne kommando? - mtools leverer mcd-kommandoen. Dens man-side siger ” Kommandoen mcd bruges til at ændre mtools-arbejdsmappe på MS-DOS-disken. ”
Svar
Eller du kan bare oprette en kort variabel on-the-fly og bruge den to gange x = longproject ; mkdir $x ; cd $x
– som jeg indrømmer, stadig er længere end at bruge en shellscript-funktion 🙂
Svar
Dette er en enkel ting at gøre i et bash-script / -funktion. Jeg oprettede en meget læselig og tilstrækkeligt dokumenteret tutorial inklusive scripts, der fungerer på både Linux og MacOS (dette vil også blive opretholdt i fremtiden).
Mit mål for tutorials-kompleksiteten er: skrevet til et målrettet publikum med de eneste forudsætninger for at brugeren har en puls og kan læse engelsk, så giv feedback, hvis du har brug for hjælp.
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 at installere dette har du to muligheder:
- Først skal du tilføje funktionen til din
.bashrc
-fil. - Den anden er at tilføje filen til din sti og kilde derefter filen i din
.bash_profile
-fil.
Igen er README-filen meget detaljeret om, hvordan du gør dette.
Held og lykke!
Svar
Her “er en lille variant, der er værd at nævne:
function mkdir() { local dir=$1 command mkdir "$dir" && cd "$dir" }
Føj dette til yo ur ~/.bash_profile
, og du kan derefter bruge mkdir
som normalt (når du først har source
” d it), bortset fra nu, kører den funktionen ovenfor i stedet for standard mkdir
kommandoen.
Bemærk, dette validerer ikke input i henhold til den accepterede svar af Gilles , men viser, hvordan du (effektivt) kan tilsidesætte indbyggede.
Fra docs (omskrevet let):
command mkdir [args]
kørermkdir
medargs
ignorerer enhver shell-funktion ved navnmkdir
. Kun shell-indbyggede kommandoer eller kommandoer, der findes ved at søge i PATH, udføres. Hvis der er en skalfunktion med navnetls
, kørercommand ls
inden for funktionen, udfører den eksterne kommandols
i stedet for at kalde funktionen rekursivt
Jeg tror builtin
opnår et lignende resultat til command
.
Kommentarer
- du bør helt sikkert citere
$dir
- @Jeff, aftalt, men det accepterede svar har al den validering, man har brug for.Jeg ‘ præsenterer netop brugen af
command
som et alternativ.
Svar
Tilføjelse af hjælpefunktion til BASH, ZSH eller KSH
Opret mkcd
kommando til dit miljø i en linje
echo -e "mkcd() {\n mkdir -p "$1" && cd $_\n}" >> ~/.${0//-/}rc && . ~/.${0//-/}rc
Svar
Hvis du bruger Oh-my-zsh , take
kommando gør tricket. Se på snydearket .
Svar
Bare automatiserede ovenstående svar og lavede et engangseksekverbart script:
fun=" mkcd () { mkdir -p -- "$1" && cd -P -- "$1" }" echo "$fun" >> ~/.bashrc
Kopier det bare i en ny fil mkcd.sh
og kør det kun en gang i terminalen ved bash mkcd.sh
. Udfør derefter source ~/.bashrc
for at få det til at fungere i den aktuelle session.
Herefter kan du bruge mkcd some_dir
til at oprette og indtast direkte i den mappe.
Kommentarer
- Du foreslår at du skriver et script (i en fil), hvis eneste formål er at føje til
~/.bashrc
fil (med et svar, der allerede er givet)? Og hvordan foreslår du at oprette dettemkcd.sh
script? Med en redaktør, måske? Dette ligner mere arbejde end bare redigering af~/.bashrc
. Hvilken fordel har dette i forhold til det accepterede svar? ………………………………………………………………………… P.S. Dette mislykkes på grund af citater af problemer, som fortæller mig, at du ikke engang har prøvet det selv. - Jeg er ked af at sige, men ja, da jeg skrev i mit svar, brugte jeg ovenstående svar. Det virker. Hvis du ikke ‘ ikke tror på mig, så prøv det. Og om ikke at prøve, brugte jeg hele dagen til at skrive sådanne scripts i bash og python i dag.
- Jeg prøvede, hvad du skrev. Det fungerer ikke .
mcd
fra unix.stackexchange.com/questions/6628/…mkdir longtitleproject
såcd !^