Ich stelle fest, dass ich viel wiederhole:
mkdir longtitleproject
cd longtitleproject
Gibt es eine Möglichkeit, dies in einer Zeile zu tun, ohne den Verzeichnisnamen zu wiederholen? Ich bin auf Bash hier.
bash
shell
command-line
methodofaction
quelle
quelle
mcd
von unix.stackexchange.com/questions/6628/…mkdir longtitleproject
danncd !^
Antworten:
Es gibt keinen eingebauten Befehl, aber Sie können leicht eine Funktion schreiben, die
mkdir
dann aufruftcd
:Fügen Sie diesen Code in Ihre
~/.bashrc
Datei ein (oder~/.kshrc
für ksh-Benutzer oder~/.zshrc
für zsh-Benutzer). Es definiert eine aufgerufene Funktionmkcd
."$1"
wird beim Ausführen durch das Argument der Funktion ersetzt.Diese einfache Version hat mehrere Mängel:
-p
Option anmkdir
. (Dies kann oder auch nicht wünschenswert sein, da es das Risiko eines Tippfehler unentdeckt bleiben erhöht, zum Beispielmkcd mydierctory/newsub
wird gerne erstellenmydierctory
undmydierctory/newsub
wenn Sie gemeint erstellennewsub
innerhalb des bestehendenmydirectory
.)-
ist aber nicht nur-
dannmkdir
undcd
wird es als Option interpretieren. Wenn es nur so ist-
,cd
wird es so interpretiert, dass es bedeutet$OLDPWD
. Wenn es+
von 0 oder mehr Ziffern gefolgt wird,cd
wird es in zsh als Index im Verzeichnisstapel interpretiert. Sie können das erste Problem beheben, aber nicht die beiden anderen, indem Sie--
vor dem Argument übergeben. Sie können all diese Probleme beheben./
, indem Sie dem Argument voranstellen , wenn es sich um einen relativen Pfad handelt.mkdir
folgt nichtCDPATH
,cd
tut es aber. Wenn Sie alsoCDPATH
einen Wert festgelegt haben, der nicht beginnt.
(eine zugegebenermaßen etwas ungewöhnliche Konfiguration), werden Siecd
möglicherweise in ein anderes Verzeichnis als das gerade erstellte gebracht. Das Voranstellen./
auf relative Pfade behebt dieses Problem (es wirdCDPATH
ignoriert).mkdir
fehlschlägt, wird versucht, es auszuführencd
. Fix: Verwenden Sie&&
diese Option, um die beiden Befehle zu trennen.Immer noch ziemlich einfach:
Diese Version hat immer noch das Potenzial,
cd
in ein anderes Verzeichnis zu wechseln als das, dasmkdir
gerade in einem Randfall erstellt wurde: Wenn das Argument to einen symbolischen Linkmkcd
enthält..
und durchläuft. Wenn zum Beispiel das aktuelle Verzeichnis eine symbolische Verknüpfung zu ist/tmp/here
undmylink
ist/somewhere/else
,mkdir mylink/../foo
wird/somewhere/else/foo
währenddessen einecd mylink/../foo
Änderung in erstelltfoo
. Es reicht nicht aus, im Argument nach symbolischen Links zu suchen, da die Shell auch symbolische Links in ihrem eigenen aktuellen Verzeichnis verfolgt und dahercd /tmp/mylink; mkdir ../foo; cd ../foo
nicht in das neue Verzeichnis (/somewhere/else/foo
), sondern in wechselt/tmp/foo
. Ein Fix für diesescd
Problem besteht darin, zuerst alle Pfadkomponenten auflösen zu lassen..
(es ist nicht sinnvoll,foo/..
if zu verwendenfoo
existiert nicht, muss alsomkdir
nie gesehen werden..
).Wir kommen zu dieser robusten, wenn auch etwas blutigen Version:
(Übung: Warum verwende ich beim ersten
cd
Aufruf eine Subshell ?)Es gibt auch weniger spezialisierte Möglichkeiten, das Wort aus der vorherigen Zeile nicht erneut eingeben zu müssen:
cd
dann Esc .(oder Alt+ .) ein, um das letzte Argument aus dem vorherigen Befehl einzufügen.cd !$
Führtcd
das letzte Argument des vorherigen Befehls aus.mkdir
incd
.quelle
ksh
und funktioniert auch in dieserzsh
Reihenfolge) für "das letzte Wort des vorherigen Befehls wiederholen". Ich benutze es ziemlich oft./a/b/..//
würde eigentlich funktionieren aber nicht/a/b/../c
. Fest. Ich habe die Frage einem breiteren Publikum gestellt.mkcd() { mkdir -p "$1" && cd "$1"; }
scheint in (meiner Instanz von) zsh kein Problem zu sein.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
(Beinhaltet das Setup und) zeigt an/tmp/here/foo
, was erstellt wurde (und was ich erwartet habe).bash
fälschlicherweise erstellt und ändert/var/tmp/somewhere/foo
.Dies ist der Einzeiler, den Sie brauchen. Keine weitere Konfiguration erforderlich:
Die
$_
Variable in Bash ist das letzte Argument, das dem vorherigen Befehl übergeben wurde. In diesem Fall der Name des gerade erstellten Verzeichnisses. Wie erklärt inman bash
:Verwenden Sie
cd $_
das letzte Argument des vorherigen Befehls statt abzurufen ,cd !$
dacd !$
gibt das letzte Argument des vorherigen Befehls in der Shell - Geschichte :Sie landen zu Hause (oder ~ /)
Sie landen in Newfolder unter zu Hause! (oder ~ / newfolder)
quelle
mkdir foo && cd foo
, was nicht praktisch ist.Es wäre mir nie in den Sinn gekommen, dieses Verhalten zu skripten, da ich fast stündlich Folgendes eingebe ...
wo bash freundlicherweise
!$
mit dem letzten Wort der letzten Zeile ersetzt; dh der lange Verzeichnisname, den Sie eingegeben haben.Darüber hinaus ist die Dateinamenergänzung in solchen Situationen Ihr Freund. Wenn Ihr neues Verzeichnis die einzige Datei im Ordner ist, erhalten Sie durch ein schnelles Doppelklicken TABdas neue Verzeichnis, ohne es erneut einzugeben.
Obwohl es cool ist, dass Sie mit bash so häufige Aufgaben wie in den anderen Antworten beschrieben skripten können, ist es meiner Meinung nach besser, die Befehlszeilen-Bearbeitungsfunktionen von bash zu erlernen, damit Ihnen bei der Arbeit auf einem anderen Computer die Syntax nicht entgeht Zucker, den Ihre benutzerdefinierten Skripte bieten.
quelle
Wie pro Welche Anpassungen haben Sie auf Ihrem Shell - Profil getan Produktivität zu erhöhen? , so mache ich es:
Dies bedeutet, dass es auch funktioniert, wenn das Verzeichnis bereits vorhanden ist.
quelle
-p
Option zu mkdir wird Fehler unterdrücken.mcd
Befehl? Welches Paket oder Projekt bietet diesen Befehl?Wenn Sie Oh My Zsh verwenden, gibt es einen Befehl namens take , der genau dies ausführt . Es würde ungefähr so aussehen.
Das habe ich eigentlich zufällig gefunden. Ich habe gerade nachgesehen und es ist auf diesem Cheat aus dem Oh My Zsh GitHub Wiki aufgelistet. Es ist ein ziemlich nützlicher Befehl und anscheinend sehr einfach, sich selbst zu erstellen.
quelle
take
:) Perfekt! Übrigens - iTerm2 mit Oh My Zsh. Hier gibt es tatsächlich 3 perfekte Antworten. Dieser, der von @ jesús-carrera, und die ausgewählte Antwort. Hängt von Ihrem Setup und Ihren Vorlieben ab.Oder Sie können einfach eine kurze Variable im
x = longproject ; mkdir $x ; cd $x
laufenden Betrieb erstellen und zweimal verwenden - was zugegebenermaßen immer noch länger ist als die Verwendung einer Shellscript-Funktion :)quelle
Hier eine kleine Variante, die es zu erwähnen gilt:
Fügen Sie dies zu Ihrem hinzu
~/.bash_profile
und Sie können es dannmkdir
wie gewohnt verwenden (sobald Sie essource
getan haben), außer jetzt wird die obige Funktion anstelle des Standardbefehlsmkdir
ausgeführt.Beachten Sie, dass hierdurch keine Eingaben gemäß der von Gilles akzeptierten Antwort validiert werden , sondern nur demonstriert wird, wie Sie Builtins (effektiv) überschreiben können.
Aus den Dokumenten (leicht umschrieben):
Ich glaube
builtin
erzielt ein ähnliches Ergebnis wiecommand
.quelle
$dir
command
als Alternative.Hinzufügen von Hilfsfunktionen zu BASH, ZSH oder KSH
Erstellen
mkcd
Sie in einer Zeile einen Befehl für Ihre Umgebungquelle
Ich habe ein Skript erstellt, das das Verzeichnis erstellt und dann die CDs darauf, dann habe ich ihm einen Alias gegeben. Und hier ist ein Kern, in dem ich es beschreibe.
https://gist.github.com/rehnen/34236d6ff270ccaa74b6#mkdir-like-it-was-bedeutet-sein
quelle
Die obigen Antworten wurden einfach automatisiert und ein einmaliges ausführbares Skript erstellt:
Kopieren Sie dies einfach in eine neue Datei
mkcd.sh
und führen Sie es nur einmal im Terminal durchbash mkcd.sh
. Führen Sie dann aussource ~/.bashrc
, damit es in der aktuellen Sitzung funktioniert.Danach können Sie mit
mkcd some_dir
das Verzeichnis erstellen und direkt eingeben.quelle
~/.bashrc
Datei anzuhängen (mit einer bereits gegebenen Antwort)? Und wie schlagen Sie vor, diesesmkcd.sh
Skript zu erstellen ? Vielleicht mit einem Redakteur? Das sieht nach mehr Arbeit als nur Bearbeitung aus~/.bashrc
. Welchen Vorteil hat dies gegenüber der akzeptierten Antwort? …………………………………………………………………………………………………………………………………………………………………….