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 longtitleproject
lalucd !^
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 longtitleproject
lalucd !^
Jawaban:
Ada tidak ada built-in perintah, tetapi Anda dapat dengan mudah menulis fungsi yang memanggil mkdir
maka cd
:
mkcd () {
mkdir "$1"
cd "$1"
}
Masukkan kode ini ke ~/.bashrc
file Anda (atau ~/.kshrc
untuk pengguna ksh, atau ~/.zshrc
untuk pengguna zsh). Ini mendefinisikan fungsi yang disebut mkcd
. "$1"
akan digantikan oleh argumen fungsi saat Anda menjalankannya.
Versi sederhana ini memiliki beberapa cacat:
-p
opsi ke mkdir
. (Ini mungkin atau mungkin tidak diinginkan, karena meningkatkan risiko kesalahan ketik tidak terdeteksi, misalnya mkcd mydierctory/newsub
akan dengan senang hati membuat mydierctory
dan mydierctory/newsub
ketika Anda bermaksud membuat newsub
di dalam yang ada mydirectory
.)-
tetapi tidak adil -
, maka mkdir
dan cd
akan menafsirkannya sebagai opsi. Jika itu adil -
, maka cd
akan menafsirkannya dengan berarti $OLDPWD
. Jika +
diikuti oleh 0 digit atau lebih, maka cd
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 mengikuti CDPATH
, tetapi cd
melakukannya, jadi jika Anda telah menetapkan CDPATH
nilai yang tidak dimulai dengan .
(konfigurasi yang agak tidak biasa), maka cd
mungkin membawa Anda ke direktori yang berbeda dari yang baru saja dibuat. Mempertahankan ./
lintasan relatif untuk memperbaikinya (menyebabkan CDPATH
diabaikan).mkdir
gagal, 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 cd
masuk ke direktori yang berbeda dari yang mkdir
baru saja dibuat dalam satu kasus tepi: jika argumen mkcd
berisi ..
dan melewati tautan simbolik. Sebagai contoh, jika direktori saat ini /tmp/here
dan mylink
merupakan link simbolik ke /somewhere/else
, kemudian mkdir mylink/../foo
menciptakan /somewhere/else/foo
sedangkan cd mylink/../foo
perubahan 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 ../foo
tidak berubah menjadi direktori baru ( /somewhere/else/foo
) tetapi menjadi /tmp/foo
. Perbaikan untuk ini adalah membiarkan cd
builtin menyelesaikan semua ..
komponen path terlebih dahulu (tidak masuk akal untuk digunakan foo/..
jikafoo
tidak ada, jadi mkdir
tidak 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 cd
panggilan 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 cd
pada argumen terakhir dari perintah sebelumnya.mkdir
menjadi 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/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:
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.
-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.
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_profile
dan Anda kemudian dapat menggunakan mkdir
seperti biasa (setelah Anda memilikinya source
), kecuali sekarang ini akan menjalankan fungsi di atas daripada mkdir
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):
command mkdir [args]
berjalanmkdir
denganargs
mengabaikan fungsi shell yang bernamamkdir
. Hanya perintah builtin shell atau perintah yang ditemukan dengan mencari PATH dieksekusi. Jika ada fungsi shell bernamals
, menjalankancommand ls
dalam fungsi akan menjalankan perintah eksternalls
alih-alih memanggil fungsi secara rekursif
Saya percaya builtin
mencapai hasil yang mirip dengan command
.
$dir
command
sebagai alternatif.
Buat mkcd
perintah 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.sh
dan jalankan hanya sekali di terminal oleh bash mkcd.sh
. Kemudian jalankan source ~/.bashrc
untuk membuatnya bekerja di sesi saat ini.
Setelah ini, Anda dapat menggunakan mkcd some_dir
untuk membuat dan memasukkan langsung di direktori itu.
~/.bashrc
file (dengan jawaban yang sudah diberikan)? Dan bagaimana saran Anda membuat mkcd.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.
mcd
dari unix.stackexchange.com/questions/6628/…