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.
mkdir longtitleprojectlalucd !^
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.
mkdir longtitleprojectlalucd !^
Jawaban:
Ada tidak ada built-in perintah, tetapi Anda dapat dengan mudah menulis fungsi yang memanggil mkdirmaka cd:
mkcd () {
mkdir "$1"
cd "$1"
}
Masukkan kode ini ke ~/.bashrcfile Anda (atau ~/.kshrcuntuk pengguna ksh, atau ~/.zshrcuntuk pengguna zsh). Ini mendefinisikan fungsi yang disebut mkcd. "$1"akan digantikan oleh argumen fungsi saat Anda menjalankannya.
Versi sederhana ini memiliki beberapa cacat:
-popsi ke mkdir. (Ini mungkin atau mungkin tidak diinginkan, karena meningkatkan risiko kesalahan ketik tidak terdeteksi, misalnya mkcd mydierctory/newsubakan dengan senang hati membuat mydierctorydan mydierctory/newsubketika Anda bermaksud membuat newsubdi dalam yang ada mydirectory.)-tetapi tidak adil -, maka mkdirdan cdakan menafsirkannya sebagai opsi. Jika itu adil -, maka cdakan menafsirkannya dengan berarti $OLDPWD. Jika +diikuti oleh 0 digit atau lebih, maka cddalam 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.mkdirtidak mengikuti CDPATH, tetapi cdmelakukannya, jadi jika Anda telah menetapkan CDPATHnilai yang tidak dimulai dengan .(konfigurasi yang agak tidak biasa), maka cdmungkin membawa Anda ke direktori yang berbeda dari yang baru saja dibuat. Mempertahankan ./lintasan relatif untuk memperbaikinya (menyebabkan CDPATHdiabaikan).mkdirgagal, ia mencoba mengeksekusi cd. Perbaiki: gunakan &&untuk memisahkan kedua perintah.Masih cukup sederhana:
mkcd () {
case "$1" in /*) :;; *) set -- "./$1";; esac
mkdir -p "$1" && cd "$1"
}
Versi ini masih memiliki potensi untuk cdmasuk ke direktori yang berbeda dari yang mkdirbaru saja dibuat dalam satu kasus tepi: jika argumen mkcdberisi ..dan melewati tautan simbolik. Sebagai contoh, jika direktori saat ini /tmp/heredan mylinkmerupakan link simbolik ke /somewhere/else, kemudian mkdir mylink/../foomenciptakan /somewhere/else/foosedangkan cd mylink/../fooperubahan ke dalam foo. Tidak cukup hanya dengan mencari tautan simbolik dalam argumen, karena shell juga melacak tautan simbolik di direktori saat ini, jadi cd /tmp/mylink; mkdir ../foo; cd ../footidak berubah menjadi direktori baru ( /somewhere/else/foo) tetapi menjadi /tmp/foo. Perbaikan untuk ini adalah membiarkan cdbuiltin menyelesaikan semua ..komponen path terlebih dahulu (tidak masuk akal untuk digunakan foo/..jikafootidak ada, jadi mkdirtidak perlu melihat ..).
Kami datang ke versi yang kuat jika sedikit berdarah ini:
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
}
(Latihan: mengapa saya menggunakan subkulit untuk cdpanggilan pertama ?)
Jika mkdir gagal, saya ingin memastikan untuk tidak mengubah direktori saat ini. Mengubah kembali dengan cd - atau $ OLDPWD tidak cukup baik jika shell tidak memiliki izin untuk berubah ke direktori saat ini. Juga, memanggil cd memperbarui OLDPWD, jadi kami hanya ingin melakukannya sekali (atau mengembalikan OLDPWD).
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 !$dieksekusi cdpada argumen terakhir dari perintah sebelumnya.mkdirmenjadi cd.ksh, dan juga berfungsi zsh) 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/fooapa yang telah dibuat (dan apa yang saya harapkan). bashmembuat dan mengubah ke /var/tmp/somewhere/foo.
Ini adalah satu-liner yang Anda butuhkan. Tidak diperlukan konfigurasi lain:
mkdir longtitleproject && cd $_
The $_variabel, di bash, adalah argumen terakhir yang diberikan kepada perintah sebelumnya. Dalam hal ini, nama direktori yang baru saja Anda buat. Sebagaimana dijelaskan dalam 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.
Gunakan cd $_untuk mengambil argumen terakhir dari perintah sebelumnya alih-alih cd !$karena cd !$memberikan argumen terakhir dari perintah sebelumnya dalam sejarah shell :
cd ~/
mkdir folder && cd !$
Anda berakhir di rumah (atau ~ /)
cd ~/
mkdir newfolder && cd $_
Anda berakhir di folder baru di bawah rumah !! (atau ~ / folder baru)
mkdir foo && cd foo, yang tidak berguna.
Tidak pernah terpikir oleh saya untuk memperbaiki perilaku ini karena saya memasukkan yang berikut setiap jam ...
$ mkdir someDirectory<ENTER>
$ cd !$
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.
Sesuai Apa penyesuaian yang telah Anda lakukan pada profil shell Anda untuk meningkatkan produktivitas? , ini adalah bagaimana saya melakukannya:
# make a directory and cd to it
mcd()
{
test -d "$1" || mkdir "$1" && cd "$1"
}
itu berarti juga berfungsi jika direktori sudah ada.
-ppilihan untuk mkdir akan menekan kesalahan.
mcdperintah 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.
take myfolder
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.
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.
Inilah sedikit varian yang layak disebutkan:
function mkdir() {
local dir=$1
command mkdir "$dir" && cd "$dir"
}
Tambahkan ini ke Anda ~/.bash_profiledan Anda kemudian dapat menggunakan mkdirseperti biasa (setelah Anda memilikinya source), kecuali sekarang ini akan menjalankan fungsi di atas daripada mkdirperintah 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):
command mkdir [args]berjalanmkdirdenganargsmengabaikan fungsi shell yang bernamamkdir. Hanya perintah builtin shell atau perintah yang ditemukan dengan mencari PATH dieksekusi. Jika ada fungsi shell bernamals, menjalankancommand lsdalam fungsi akan menjalankan perintah eksternallsalih-alih memanggil fungsi secara rekursif
Saya percaya builtinmencapai hasil yang mirip dengan command.
$dir
commandsebagai alternatif.
Buat mkcdperintah untuk lingkungan Anda dalam satu baris
echo -e 'mkcd() {\n mkdir -p "$1" && cd $_\n}' >> ~/.${0//-/}rc && . ~/.${0//-/}rc
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
Cukup otomatiskan jawaban di atas dan buat skrip yang dapat dieksekusi satu kali:
fun='
mkcd ()
{
mkdir -p -- "$1" && cd -P -- "$1"
}'
echo "$fun" >> ~/.bashrc
Cukup salin ini di file baru mkcd.shdan jalankan hanya sekali di terminal oleh bash mkcd.sh. Kemudian jalankan source ~/.bashrcuntuk membuatnya bekerja di sesi saat ini.
Setelah ini, Anda dapat menggunakan mkcd some_diruntuk membuat dan memasukkan langsung di direktori itu.
~/.bashrcfile (dengan jawaban yang sudah diberikan)? Dan bagaimana saran Anda membuat mkcd.shskrip 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.
mcddari unix.stackexchange.com/questions/6628/…