Saya mendapati diri saya mengulangi banyak hal:
mkdir longtitleproject
cd longtitleproject
Apakah ada cara melakukannya dalam satu baris tanpa mengulangi nama direktori? Saya bash di sini.
bash
shell
command-line
metode tindakan
sumber
sumber
mcd
dari unix.stackexchange.com/questions/6628/…mkdir longtitleproject
lalucd !^
Jawaban:
Ada tidak ada built-in perintah, tetapi Anda dapat dengan mudah menulis fungsi yang memanggil
mkdir
makacd
:Masukkan kode ini ke
~/.bashrc
file Anda (atau~/.kshrc
untuk pengguna ksh, atau~/.zshrc
untuk pengguna zsh). Ini mendefinisikan fungsi yang disebutmkcd
."$1"
akan digantikan oleh argumen fungsi saat Anda menjalankannya.Versi sederhana ini memiliki beberapa cacat:
-p
opsi kemkdir
. (Ini mungkin atau mungkin tidak diinginkan, karena meningkatkan risiko kesalahan ketik tidak terdeteksi, misalnyamkcd mydierctory/newsub
akan dengan senang hati membuatmydierctory
danmydierctory/newsub
ketika Anda bermaksud membuatnewsub
di dalam yang adamydirectory
.)-
tetapi tidak adil-
, makamkdir
dancd
akan menafsirkannya sebagai opsi. Jika itu adil-
, makacd
akan menafsirkannya dengan berarti$OLDPWD
. Jika+
diikuti oleh 0 digit atau lebih, makacd
dalam zsh akan mengartikannya sebagai indeks dalam tumpukan direktori. Anda dapat memperbaiki masalah pertama, tetapi tidak dua lainnya, dengan melewati--
sebelum argumen. Anda bisa memperbaiki semua masalah ini dengan menambahkan./
argumen jika itu jalan relatif.mkdir
tidak mengikutiCDPATH
, tetapicd
melakukannya, jadi jika Anda telah menetapkanCDPATH
nilai yang tidak dimulai dengan.
(konfigurasi yang agak tidak biasa), makacd
mungkin membawa Anda ke direktori yang berbeda dari yang baru saja dibuat. Mempertahankan./
lintasan relatif untuk memperbaikinya (menyebabkanCDPATH
diabaikan).mkdir
gagal, ia mencoba mengeksekusicd
. Perbaiki: gunakan&&
untuk memisahkan kedua perintah.Masih cukup sederhana:
Versi ini masih memiliki potensi untuk
cd
masuk ke direktori yang berbeda dari yangmkdir
baru saja dibuat dalam satu kasus tepi: jika argumenmkcd
berisi..
dan melewati tautan simbolik. Sebagai contoh, jika direktori saat ini/tmp/here
danmylink
merupakan link simbolik ke/somewhere/else
, kemudianmkdir mylink/../foo
menciptakan/somewhere/else/foo
sedangkancd mylink/../foo
perubahan ke dalamfoo
. Tidak cukup hanya dengan mencari tautan simbolik dalam argumen, karena shell juga melacak tautan simbolik di direktori saat ini, jadicd /tmp/mylink; mkdir ../foo; cd ../foo
tidak berubah menjadi direktori baru (/somewhere/else/foo
) tetapi menjadi/tmp/foo
. Perbaikan untuk ini adalah membiarkancd
builtin menyelesaikan semua..
komponen path terlebih dahulu (tidak masuk akal untuk digunakanfoo/..
jikafoo
tidak ada, jadimkdir
tidak perlu melihat..
).Kami datang ke versi yang kuat jika sedikit berdarah ini:
(Latihan: mengapa saya menggunakan subkulit untuk
cd
panggilan pertama ?)Ada juga cara yang kurang terspesialisasi untuk tidak perlu mengetik ulang kata dari baris sebelumnya:
cd
, lalu Esc .(atau Alt+ .) untuk memasukkan argumen terakhir dari perintah sebelumnya.cd !$
dieksekusicd
pada argumen terakhir dari perintah sebelumnya.mkdir
menjadicd
.sumber
ksh
, dan juga berfungsizsh
) untuk "ulangi kata terakhir dari perintah sebelumnya". Saya sering menggunakannya./a/b/..//
akan benar-benar berfungsi tetapi tidak/a/b/../c
. Tetap. Saya telah mengajukan pertanyaan kepada audiens yang lebih luas.mkcd() { mkdir -p "$1" && cd "$1"; }
tampaknya tidak menjadi masalah di (contoh saya) 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
(termasuk pengaturan dan) menampilkan/tmp/here/foo
apa yang telah dibuat (dan apa yang saya harapkan).bash
membuat dan mengubah ke/var/tmp/somewhere/foo
.Ini adalah satu-liner yang Anda butuhkan. Tidak diperlukan konfigurasi lain:
The
$_
variabel, di bash, adalah argumen terakhir yang diberikan kepada perintah sebelumnya. Dalam hal ini, nama direktori yang baru saja Anda buat. Sebagaimana dijelaskan dalamman bash
:Gunakan
cd $_
untuk mengambil argumen terakhir dari perintah sebelumnya alih-alihcd !$
karenacd !$
memberikan argumen terakhir dari perintah sebelumnya dalam sejarah shell :Anda berakhir di rumah (atau ~ /)
Anda berakhir di folder baru di bawah rumah !! (atau ~ / folder baru)
sumber
mkdir foo && cd foo
, yang tidak berguna.Tidak pernah terpikir oleh saya untuk memperbaiki perilaku ini karena saya memasukkan yang berikut setiap jam ...
di mana bash dengan ramah mengganti
!$
dengan kata terakhir dari baris terakhir; yaitu nama direktori panjang yang Anda masukkan.Selain itu, penyelesaian nama file adalah teman Anda dalam situasi seperti itu. Jika direktori baru Anda adalah satu-satunya file dalam folder tersebut, double cepat TABakan memberi Anda direktori baru tanpa memasukkannya kembali.
Meskipun keren, bash memungkinkan Anda untuk skrip tugas-tugas umum seperti jawaban lain menyarankan saya pikir lebih baik untuk mempelajari fitur pengeditan baris perintah yang ditawarkan bash sehingga ketika Anda bekerja pada komputer lain Anda tidak kehilangan sintaksisnya gula yang disediakan skrip khusus Anda.
sumber
Sesuai Apa penyesuaian yang telah Anda lakukan pada profil shell Anda untuk meningkatkan produktivitas? , ini adalah bagaimana saya melakukannya:
itu berarti juga berfungsi jika direktori sudah ada.
sumber
-p
pilihan untuk mkdir akan menekan kesalahan.mcd
perintah yang ada ? Paket atau proyek mana yang menyediakan perintah ini?Jika Anda menggunakan Oh My Zsh, ada perintah yang disebut take yang melakukan hal ini. Akan terlihat seperti ini.
Saya benar-benar menemukan ini secara tidak sengaja. Saya baru saja melihat dan terdaftar di cheatsheat ini dari wiki Oh My Zsh GitHub. Ini perintah yang cukup berguna, dan tampaknya sangat mudah dibuat sendiri.
sumber
take
:) Sempurna! btw - iTerm2 dengan Oh My Zsh. Sebenarnya ada 3 jawaban sempurna di sini. Yang ini, yang oleh @ jesús-carrera, dan jawaban yang dipilih. Tergantung pengaturan dan preferensi Anda.Atau Anda bisa membuat variabel pendek on-the-fly dan menggunakannya dua kali
x = longproject ; mkdir $x ; cd $x
- yang saya akui masih lebih lama daripada menggunakan fungsi shellscript :)sumber
Inilah sedikit varian yang layak disebutkan:
Tambahkan ini ke Anda
~/.bash_profile
dan Anda kemudian dapat menggunakanmkdir
seperti biasa (setelah Anda memilikinyasource
), kecuali sekarang ini akan menjalankan fungsi di atas daripadamkdir
perintah standar .Catatan, ini tidak memvalidasi input sesuai jawaban yang diterima oleh Gilles , tetapi menunjukkan bagaimana Anda dapat (secara efektif) mengesampingkan builtin.
Dari dokumen (parafrase sedikit):
Saya percaya
builtin
mencapai hasil yang mirip dengancommand
.sumber
$dir
command
sebagai alternatif.Menambahkan fungsi pembantu ke BASH, ZSH atau KSH
Buat
mkcd
perintah untuk lingkungan Anda dalam satu barissumber
Saya membuat skrip yang membuat direktori dan kemudian cd untuk itu, lalu saya berikan alias. Dan di sini adalah inti di mana saya menggambarkannya.
https://gist.github.com/rehnen/34236d6ff270ccaa74b6#mkdir-like-it-was-meant-to-be
sumber
Cukup otomatiskan jawaban di atas dan buat skrip yang dapat dieksekusi satu kali:
Cukup salin ini di file baru
mkcd.sh
dan jalankan hanya sekali di terminal olehbash mkcd.sh
. Kemudian jalankansource ~/.bashrc
untuk membuatnya bekerja di sesi saat ini.Setelah ini, Anda dapat menggunakan
mkcd some_dir
untuk membuat dan memasukkan langsung di direktori itu.sumber
~/.bashrc
file (dengan jawaban yang sudah diberikan)? Dan bagaimana saran Anda membuatmkcd.sh
skrip ini ? Dengan seorang editor, mungkin? Ini terlihat seperti lebih banyak pekerjaan daripada sekadar mengedit~/.bashrc
. Apa keuntungannya dari jawaban yang diterima? ... ... ... ... ... ... ... ... ... "..." ... "..." ... "" ... "..." ... "" Ini akan gagal karena mengutip masalah, yang mengatakan kepada saya bahwa Anda bahkan belum mencobanya sendiri.