Saya ingin membuat fungsi singkat untuk melakukan hal berikut. Katakanlah saya memindahkan file 'file.tex' ke direktori dokumen saya:
mv file.tex ~/Documents
Lalu, saya ingin cd
ke direktori itu:
cd ~/Documents
Saya ingin menggeneralisasi ini ke direktori mana saja, sehingga saya bisa melakukan ini:
mv file.tex ~/Documents
follow
dan minta follow
perintah membaca tujuan dari perintah sebelumnya, kemudian jalankan sesuai. Untuk direktori sederhana, ini tidak menghemat banyak waktu, tetapi ketika bekerja dengan direktori bersarang, akan sangat luar biasa untuk dapat menggunakan saja
mv file.tex ~/Documents/folder1/subfolder1
follow
Saya pikir itu akan relatif sederhana, dan saya bisa melakukan sesuatu seperti ini:
follow()
{
place=`history 2 | sed -n '1p;1q' | rev | cut -d ' ' -f1 | rev`
cd $place
}
tapi ini sepertinya tidak berhasil. Jika saya echo $place
, saya mendapatkan string yang diinginkan (saya sedang menguji dengan ~/Documents
), tetapi perintah terakhir kembali
No such file or directory
Direktori pasti ada. Saya bingung. Bisakah Anda membantu saya?
sumber
file.tex
di lokasi asli, symlink adalah alternatif yang sangat baik, karena Anda hanya perlu menautkan satu kali, dan itu akan selalu mengarah ke versi terbaru.cd
alt +.
untuk mengganti token terakhir dari perintah sebelumnya. Ulangi untuk melangkah lebih jauh ke belakang dalam sejarah token terakhir. (Saya katakan token bukan arg, karenafoo &
meraih&
sebagai token terakhir.) Anda dapat menggunakan argumen numerik (dengan escape-3 alt +. Misalnya).Jawaban:
Alih-alih mendefinisikan fungsi, Anda bisa menggunakan variabel
$_
, yang diperluas ke argumen terakhir dari perintah sebelumnya denganbash
. Jadi gunakan:setelah
mv
perintah.Anda juga dapat menggunakan ekspansi riwayat:
Jika Anda harus menggunakan fungsi:
NB: Jawaban ini ditargetkan ke format argumen baris perintah persis yang telah Anda gunakan saat kita berurusan dengan parameter posisi. Untuk format lain misalnya
mv -t foo bar.txt
, Anda harus memasukkan pemeriksaan khusus sebelumnya, pembungkus akan lebih sesuai.sumber
cd !$
ataucd $(dirname !$)
. Tidak tahu tentang$_
variabel!mv -t ~/Documents file.tex
bukanmv file.tex ~/Documents
? Intinya, saya tidak yakin ini dapat dipecahkan dalam kasus umum ... fungsi pembungkus di sekitar atau bahwa penambahanmv
mungkin lebih baik ...!$
setara dengan!:$
dan lebih cepat untuk mengetik.Dengan keybindings bash standar, kombinasinya Alt. akan menyalin argumen terakhir dari baris perintah sebelumnya ke yang sekarang. Jadi, mengetik
akan menghasilkan
dan akan lebih sedikit mengetik daripada kata
follow
.Untuk menambah kenyamanan, ulangi Alt. kombinasi akan menelusuri argumen terakhir dari semua baris perintah sebelumnya.
Tambahan: Nama perintah bash yang terkait dengan kombinasi tombol ini adalah
yank-last-arg
atauinsert-last-argument
. Ini dapat ditemukan di halaman bash di bawah "Perintah untuk Memanipulasi Sejarah" atau di Manual Referensi Bash yang lebih lengkap .)sumber
<esc>
itu.
untuk mendapatkan hasil yang sama seperti<alt>+.
, ini berguna ketika Anda telah memetakan capslock untuk melarikan diri :)Anda hampir pasti mengalami masalah bahwa ekspansi tilde terjadi sebelum ekspansi parameter, yang dapat dijelaskan dengan contoh ringkas:
Ini bisa diatasi dengan
eval
. Bagaimanapun, Anda akan perlueval
, karena Anda menarik perintah dari sejarah dan mereka dapat berisi ekspansi sewenang-wenang, seperti:(Ada masalah, seperti bahwa perluasan kembali nilai-nilai ini mungkin tidak lagi sesuai dengan ekspansi asli yang terjadi. Misalkan
compute_folder_name
adalah fungsi yang menambah beberapa variabel global.)sumber
eval
. (Ever.) Tapi bagus melihat masalah urutan ekspansi. Jika Anda menyebutkan kelayakan ekspansi sejarah untuk digunakan dieval
sini, ini akan menjadi jawaban terbaik menurut saya; tidak ada yang benar-benar menjelaskan mengapa solusi Poster Asli gagal berfungsi.