Saya tidak tahu berapa kali saya berharap untuk sebuah perintah yang akan membuat direktori dan pindah ke direktori itu. Pada dasarnya, saya ingin yang setara dari yang berikut:
mkdir -p /arbitrarily/long/path; cd /arbitrarily/long/path
tetapi hanya harus mengetik satu /arbitrarily/long/path
kali, seperti:
mk-cd /arbitrarily/long/path
Saya mencoba membuat skrip untuk melakukan ini, tetapi hanya mengubah direktori di dalam skrip. Saya ingin direktori di shell berubah juga.
#!/bin/bash
mkdir $1
cd $1
export PWD=$PWD
Bagaimana saya bisa membuat ini bekerja?
cd
, Anda memilih kasing khusus sejak awal. : Dcd
info terkait- super keren (kembali ke direktori sebelumnya menggunakancd -
, menggunakanpushd
danpopd
untuk mempertahankan "tumpukan" direktori): superuser.com/questions/324512/…mkdir -p /very/long/path
, lalu menggunakancd
, spasi, dan kemudian tekan Alt +.
untuk mengulangi argumen terakhir, yaitu nama dir.mkdir -p /very/long/path; cd !#:2
. String!#:2
akan diperluas ke argumen nr. 2 (yaitu argumen ketiga/very/long/path
, ketika penghitungan dimulai dengan nol).!$
. Saya menggunakan trik khusus ini sepanjang waktu, meskipun ada banyak lagi yang dapat Anda lakukan dengan ekspansi sejarah .Jawaban:
Cara paling sederhana adalah dengan menggunakan fungsi shell:
Tempatkan di
.bashrc
file Anda agar tersedia untuk Anda seperti perintah shell lainnya.Alasan mengapa itu tidak berfungsi sebagai skrip eksternal adalah
cd
mengubah direktori saat ini dari skrip yang sedang berjalan tetapi tidak mempengaruhi yang memanggil. Ini dengan desain! Setiap proses memiliki direktori kerjanya sendiri yang diwarisi oleh anak-anaknya, tetapi sebaliknya tidak mungkin.Kecuali jika bagian dari pipeline, berjalan di latar belakang atau secara eksplisit dalam subshell, fungsi shell tidak berjalan dalam proses yang terpisah tetapi dalam proses yang sama, seperti jika perintah telah bersumber. Shell direktori saat ini kemudian dapat diubah oleh suatu fungsi.
The
&&
digunakan di sini untuk memisahkan kedua perintah yang digunakan berarti, jika perintah pertama berhasil (mkdir
), menjalankan kedua (cd
). Akibatnya, jikamkdir
gagal membuat direktori yang diminta, tidak ada gunanya mencoba masuk ke dalamnya. Pesan kesalahan dicetak olehmkdir
dan hanya itu.The
-p
pilihan yang digunakan denganmkdir
yang ada untuk memberitahu utilitas ini untuk membuat direktori yang hilang yang merupakan bagian dari path lengkap dari nama direktori diberikan sebagai argumen. Satu efek samping adalah bahwa jika Anda meminta untuk membuat direktori yang sudah ada,mkcd
fungsi tidak akan gagal dan Anda akan berakhir di direktori itu. Itu mungkin dianggap masalah atau fitur. Dalam kasus sebelumnya, fungsi dapat dimodifikasi misalnya dengan cara yang hanya memperingatkan pengguna:Tanpa
-p
opsi, perilaku fungsi awal akan sangat berbeda.Jika direktori yang berisi direktori untuk membuat belum ada,
mkdir
gagal dan begitu pula fungsinya.Jika direktori yang akan dibuat sudah ada,
mkdir
gagal juga dancd
tidak dipanggil.Akhirnya, perhatikan bahwa pengaturan / ekspor
PWD
tidak ada gunanya, karena shell sudah melakukannya secara internal.Sunting: Saya menambahkan
--
opsi ke kedua perintah untuk fungsi untuk memungkinkan nama direktori dimulai dengan tanda hubung.sumber
~/.bashrc
atau salah satu skrip inisialisasi lainnya.alias mk-cd 'mkdir -p \!:1; cd \!:1'
tanpa fungsi? Atau mungkin saya harus mulai memikirkan fungsi bash lebih seperti alias yang diperluas?csh
Mekanisme berlalunya argumen ini tidak diterapkan dengan alias gaya bourne. Fungsi memang cara untuk pergi, menjadi jauh lebih fleksibel.bar
). Pilihan lain adalah menggunakanhistory 1
, seperti dialias mk-cd='args="$(history 1)" && args="${args#*mk-cd\ }" && mkdir -p "$args" && cd'
- ini berfungsi dengan baik untuk contoh si penanya, tetapi bukan solusi umum, karena perintah lain pada baris yang sama (mis., Piping output) akan menyebabkannya gagal.Saya ingin menambahkan solusi alternatif.
Script Anda akan berfungsi jika Anda memintanya dengan perintah
.
atausource
:Jika Anda melakukan ini,
export
dalam skrip tidak perlu. Anda dapat memotong pengetikan.
dengan menggunakanalias
:Alasan ini berfungsi adalah karena skrip biasanya berjalan di sub-shell sehingga lingkungannya hilang pada penyelesaian, tetapi perintah
.
(atausource
) memaksanya untuk berjalan di shell saat ini.Teknik ini dapat berguna untuk urutan perintah yang terlalu kompleks untuk suatu fungsi atau yang sedang dalam pengembangan dan sering diedit: setelah
alias
dimasukkan.bash_aliases
, Anda dapat mengedit skrip sesuka hati tanpa menginisialisasi ulang.Perhatikan yang berikut ini: -
Jika Anda menulis skrip yang harus dipanggil dengan
.
/source
perintah, ada dua cara untuk memastikan hal ini: -Untuk beberapa alasan, skrip yang dipanggil dengan
.
/source
tidak perlu dieksekusi, jadi cukup hapus izin ini dan skrip tidak akan ditemukan dalam "$ PATH" atau akan memberikan kesalahan izin jika dipanggil dengan jalur eksplisit.Atau, trik berikut dapat digunakan di bagian atas skrip:
Ini bekerja karena dalam sub-shell
bind
mengeluarkan peringatan, meskipun tidak ada status kesalahan: karenanyaread
digunakan untuk memberikan kesalahan pada input tidak.sumber
.
. Saya telah melakukan. .bashrc
berkali-kali, tetapi tidak tahu persis apa yang.
dilakukannya. Apakah ini miripexport
?export var
menyalin variabel internalvar
ke lingkungan, di mana ia diwariskan dan diimpor sebagai variabel di setiap sub-shell, tetapi tidak berpengaruh pada shell induk. Biasanya sub-shell dibuat untuk menjalankan skrip, dan setiap perubahan yang dibuatnya (termasuk variabel yang diekspor) hilang ketika selesai. Agar skrip mengatur variabel dalam shell, skrip harus dijalankan di dalam shell itu, dan inilah yang dilakukan.
perintah: jalankan skrip tanpa membuat sub-shell. Anehnya, skrip yang dijalankan.
tidak perlu memiliki izin yang dapat dieksekusi..
danexport
perintah, judul pertanyaan ini tidak akan mengarahkan Anda untuk mengharapkan jawaban di sini, jadi saya akan membiarkan jawaban saya tetap seperti itu, tetapi terima kasih atas komentar Anda.Bukan perintah tunggal, tetapi Anda tidak perlu mengetik ulang semua lintasan cukup gunakan
!$
(yang merupakan argumen terakhir dari perintah sebelumnya dalam sejarah shell).Contoh:
sumber
Dengan membuat alias . Cara yang sangat populer untuk membuat perintah Anda sendiri.
Anda dapat membuat alias dengan cepat:
Itu dia. Jika Anda ingin menyimpan alias itu secara permanen (bukan hanya sesi saat ini), maka letakkan perintah itu dalam sebuah dotfile (biasanya ~ / .bash_aliases atau ~ / .bash_profile).
sumber
Selain apa yang sudah dikatakan, saya ingin merekomendasikan thefuck . Ini adalah kerangka kerja Python untuk merampingkan proses shell Anda dengan memperbaiki kesalahan. Terinspirasi oleh tweet ini , yang harus Anda lakukan adalah mengetik alias Anda yang telah dikonfigurasi (secara default
fuck
) dan akan mencoba untuk memperbaiki perintah Anda sebelumnya. Salah satu perbaikannya berperilaku sebagai berikut:sumber