Saya mencoba menulis skrip kecil untuk mengubah direktori saat ini ke direktori proyek saya:
#!/bin/bash
cd /home/tree/projects/java
Saya menyimpan file ini sebagai proj, menambahkan izin eksekusi chmod
, dan menyalinnya ke /usr/bin
. Ketika saya menyebutnya dengan:,
proj
ia tidak melakukan apa-apa. Apa yang saya lakukan salah?
pwd
di baris terakhir. Jadi sebelum skrip selesai maka Anda dapat memeriksa apakah berfungsi atau tidak ..cd
perintah berfungsi dengan baik di dalam skrip, coba sendiri.cd
lokasinya?Jawaban:
Script Shell dijalankan di dalam subkulit, dan setiap subkulit memiliki konsep sendiri tentang apa direktori saat ini. The
cd
berhasil, tetapi segera setelah keluar subkulit, Anda kembali berada di shell interaktif dan tidak pernah berubah di sana.Salah satu cara untuk mengatasi ini adalah dengan menggunakan alias sebagai gantinya:
sumber
. my-script
atausource my-script
.Anda tidak melakukan kesalahan! Anda telah mengubah direktori, tetapi hanya di dalam subkulit yang menjalankan skrip.
Anda dapat menjalankan skrip dalam proses Anda saat ini dengan perintah "dot":
Tapi saya lebih suka saran Greg untuk menggunakan alias dalam kasus sederhana ini.
sumber
.
juga diejasource
, pilih mana yang Anda anggap lebih berkesan.Secara otomatis
cd
skrip Anda berfungsi saat ia mengubah direktori shell yang menjalankan skrip, tetapi itu adalah proses terpisah yang bercabang dari shell interaktif Anda.Cara yang kompatibel dengan Posix untuk menyelesaikan masalah ini adalah dengan mendefinisikan prosedur shell daripada skrip perintah yang dipanggil oleh shell .
Anda bisa mengetik ini atau memasukkannya ke dalam salah satu dari berbagai file startup shell.
sumber
jhome(){ cd /home/tree/projects/$1; }
Ini
cd
dilakukan di dalam shell skrip. Ketika skrip berakhir, shell itu keluar, dan kemudian Anda ditinggalkan di direktori Anda. "Sumber" skrip, jangan jalankan. Dari pada:melakukan
(Perhatikan titik dan spasi sebelum nama skrip.)
sumber
source
myscript.sh
ada dalam direktori yang termasuk dalam $ PATH, Anda dapat sumbernya dari mana saja tanpa menentukan path lengkap.Untuk membuat skrip bash yang akan di-cd ke direktori tertentu:
Buat file skrip
Kemudian buat alias di file startup Anda.
Sebagai contoh, buat file aliases / functions master: /scripts/mastercode.sh
(Masukkan alias dalam file ini.)
Kemudian di akhir file .bashrc Anda :
Sekarang mudah untuk cd ke direktori java Anda, cukup ketik cdjava dan Anda berada di sana.
sumber
mastercode.sh
tidak memerlukan shabang (#!/bin/sh
), karena tidak (dan tidak bisa) dieksekusi dalam sebuah subkulit. Tetapi pada saat yang sama, Anda perlu mendokumentasikan "rasa" dari file ini; misalnya, ksh atau bash (atau (t) csh / zsh, dll), dan hampir pasti tidak benar-benarsh
. Saya biasanya menambahkan komentar (tetapi bukan shebang) untuk mengomunikasikan ini; mis., "file ini dimaksudkan bersumber (dari bash), tidak dijalankan sebagai skrip shell."source
d (melaluialias
), variabel-variabel tersebut akan bocor ke lingkungan shell Anda. Untuk menghindarinya, lakukan semua pekerjaan skrip dalam suatu fungsi, dan panggil saja di akhir skrip. Dalam fungsi tersebut, deklarasikan variabel apa punlocal
.Anda dapat menggunakan
.
untuk menjalankan skrip di lingkungan shell saat ini:atau sebagai alternatif, alias lebih mudah dibaca tetapi spesifik shell
source
:Ini menghindari subkulit, dan memungkinkan variabel atau bawaan apa pun (termasuk
cd
) untuk memengaruhi shell saat ini.sumber
Gagasan Jeremy Ruten untuk menggunakan symlink memicu pemikiran yang belum melewati jawaban lain. Menggunakan:
Usus besar penting; itu berarti bahwa jika ada direktori 'dir' di direktori saat ini, maka '
cd dir
' akan berubah menjadi itu, daripada melompat ke tempat lain. Dengan nilai yang ditetapkan seperti yang ditunjukkan, Anda dapat melakukan:dan, jika tidak ada sub-direktori yang disebut java di direktori saat ini, maka ia akan membawa Anda langsung ke $ HOME / proyek / java - tidak ada alias, tidak ada skrip, tidak ada administrator yang meragukan atau perintah dot.
$ HOME saya adalah / Pengguna / jleffler; $ CDPATH saya adalah:
sumber
Gunakan
exec bash
di akhirNamun, pertanyaan ini sering ditanyakan karena seseorang ingin dibiarkan pada bash prompt (baru) di direktori tertentu setelah eksekusi skrip bash dari direktori lain.
Jika ini masalahnya, jalankan saja instance bash anak di akhir skrip:
sumber
exit
Anda akan kembali ke shell tempat Anda menjalankan skrip ini.Saya mendapatkan kode saya untuk bekerja dengan menggunakan
. <your file name>
./<your file name>
Dosis tidak berfungsi karena tidak mengubah direktori Anda di terminal, itu hanya mengubah direktori khusus untuk skrip itu.Ini program saya
Ini terminal saya
sumber
. something
dan./something
?? Jawaban ini berhasil untuk saya dan saya tidak mengerti mengapa.. something
memungkinkan Anda menjalankan skrip dari lokasi mana pun,./something
mengharuskan Anda berada di direktori tempat file disimpan.#!. /bin/bash
?jalankan saja:
sumber
Saat Anda menjalankan skrip shell, ia menjalankan instance baru dari shell itu (
/bin/bash
). Dengan demikian, skrip Anda hanya menjalankan shell, mengubah direktori dan keluar. Dengan kata lain,cd
(dan perintah lain semacam itu) dalam skrip shell tidak mempengaruhi atau tidak memiliki akses ke shell dari mana mereka diluncurkan.sumber
Pada kasus khusus saya, saya perlu terlalu banyak kali untuk mengubah untuk direktori yang sama. Jadi di .bashrc saya (saya menggunakan ubuntu) saya telah menambahkan
1 -
2-
3 -
Secara langsung itu akan dilakukan: cd / home / tree / proyek / java
Semoga itu bisa membantu!
sumber
Anda dapat melakukan hal berikut:
EDIT: Ini bisa 'bertitik' juga, untuk mencegah pembuatan kerang berikutnya.
Contoh:
sumber
exit
(atau ctrl + d) beberapa kali untuk keluar dari shell, misalnya .. Sebuah alias jauh lebih bersih (bahkan jika perintah shell menghasilkan direktori, dan itu cd ke output - alias something = "cdgetnewdirectory.sh
")Itu hanya mengubah direktori untuk skrip itu sendiri, sementara direktori Anda saat ini tetap sama.
Anda mungkin ingin menggunakan tautan simbolik sebagai gantinya. Ini memungkinkan Anda untuk membuat "jalan pintas" ke file atau direktori, jadi Anda hanya perlu mengetikkan sesuatu seperti
cd my-project
.sumber
Anda dapat menggabungkan pendekatan alias dan titik Adam & Greg untuk membuat sesuatu yang bisa lebih dinamis—
Sekarang menjalankan alias proyek akan menjalankan skrip proyek di shell saat ini sebagai lawan dari subkulit.
sumber
Anda dapat menggabungkan alias dan skrip,
dengan ketentuan bahwa skrip menggemakan jalur tujuan. Perhatikan bahwa itu adalah backticks yang mengelilingi nama skrip.
Misalnya, skrip Anda bisa jadi
Keuntungan dengan teknik ini adalah bahwa skrip dapat mengambil sejumlah parameter baris perintah dan memancarkan tujuan yang berbeda yang dihitung oleh logika yang mungkin kompleks.
sumber
proj() { cd "/home/user/projects/java/$1"; }
=>proj "foo"
(atau,proj "foo bar"
<= jika Anda memiliki spasi) ... atau bahkan (misalnya):proj() { cd "/home/user/projects/java/$1"; shift; for d; do cd "$d"; done; }
=>proj a b c
=> melakukan suatucd
ke/home/user/projects/java/a/b/c
untuk menavigasi direktori dengan cepat, ada $ CDPATH, cdargs, dan cara untuk menghasilkan alias secara otomatis
http://jackndempsey.blogspot.com/2008/07/cdargs.html
http://muness.blogspot.com/2008/06/lazy-bash-cd-aliaes.html
https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5827311.html
sumber
Dalam file ~ / .bash_profile Anda. tambahkan fungsi selanjutnya
Mulai ulang terminal dan Anda dapat mengetik
dan Anda akan dipindahkan ke folder tujuan.
sumber
Anda dapat menggunakan operator &&:
cd myDirectory && ls
sumber
&&
jika Anda ingin yang kedua bersyarat pada yang pertama, atau hanya dengan;
atau baris baru di antara mereka) tetapi menempatkan ini dalam skrip akan membawa Anda kembali ke "mengapa induk shell tidak menggunakan direktori baru ketikacd
sebenarnya berhasil? "Meskipun sumber skrip yang ingin Anda jalankan adalah salah satu solusi, Anda harus menyadari bahwa skrip ini kemudian dapat secara langsung mengubah lingkungan shell Anda saat ini. Juga tidak mungkin untuk mengajukan argumen lagi.
Cara lain untuk dilakukan, adalah mengimplementasikan skrip Anda sebagai fungsi dalam bash.
Teknik ini digunakan oleh autojump: http://github.com/joelthelion/autojump/wiki untuk memberi Anda belajar bookmark direktori shell.
sumber
Anda dapat membuat fungsi seperti di bawah ini di Anda
.bash_profile
dan itu akan berfungsi dengan lancar.Fungsi berikut mengambil parameter opsional yang merupakan proyek. Misalnya, Anda bisa menjalankannya
atau
Berikut ini definisi fungsinya.
Jangan lupa untuk sumber
.bash_profile
sumber
Ini harus melakukan apa yang Anda inginkan. Ubah ke direktori yang menarik (dari dalam skrip), dan kemudian menelurkan bash shell baru.
Jika Anda menjalankan ini, itu akan membawa Anda ke direktori yang menarik dan ketika Anda keluar itu akan membawa Anda kembali ke tempat semula.
Ini bahkan akan membawa Anda untuk kembali ke direktori asli Anda ketika Anda keluar ( CTRL+ d)
sumber
LOOOOOng kali setelahnya, tetapi saya melakukan yang berikut:
buat file bernama case
rekatkan yang berikut dalam file:
simpan lalu:
Saya juga membuat alias di
.bashrc
:sekarang ketika saya mengetik:
intinya saya mengetik:
Anda dapat mengetik folder apa pun setelah 'huruf':
yang seperti mengetik:
masing-masing
Dalam kasus saya jalannya jauh lebih lama - orang-orang ini menyimpulkannya dengan ~ info sebelumnya.
sumber
cd
alias adalah berlebihan dan janggal; alias seharusnya '. ~ / case` sebagai gantinya. Jugacase
merupakan kata kunci yang dipesan, jadi pilihan yang agak buruk untuk sebuah nama.Anda tidak memerlukan skrip, hanya mengatur opsi yang benar dan membuat variabel lingkungan.
di Anda
~/.bashrc
memungkinkan untukcd
konten variabel lingkungan.Buat variabel lingkungan seperti itu:
dan Anda dapat menggunakan:
Alternatif lain .
sumber
Jika Anda menggunakan ikan sebagai cangkang Anda, solusi terbaik adalah membuat fungsi. Sebagai contoh, diberikan pertanyaan asli, Anda dapat menyalin 4 baris di bawah ini dan menempelkannya ke baris perintah ikan Anda:
Ini akan membuat fungsi dan menyimpannya untuk digunakan nanti. Jika proyek Anda berubah, ulangi saja proses menggunakan jalur baru.
Jika suka, Anda dapat menambahkan file fungsi secara manual dengan melakukan hal berikut:
dan masukkan teks:
dan akhirnya tekan ctrl + x untuk keluar dan y diikuti dengan kembali untuk menyimpan perubahan Anda.
( CATATAN: metode pertama menggunakan funcsave membuat file proj.fish untuk Anda ).
sumber
Saya punya skrip bash sederhana bernama p untuk mengelola perubahan direktori pada
github.com/godzilla/bash-stuff
cukup letakkan skrip di direktori bin lokal Anda (/ usr / local / bin)
dan masukkan
di .bashrc Anda
sumber
Perhatikan diskusi Bagaimana cara mengatur direktori kerja dari proses induk?
Ini berisi beberapa jawaban meretas, misalnya https://stackoverflow.com/a/2375174/755804 (mengubah direktori proses induk melalui gdb, jangan lakukan ini) dan https://stackoverflow.com/a/51985735/755804 ( perintah
tailcd
yang menyuntikkan dirname cd ke input stream dari proses induk; well, idealnya itu harus menjadi bagian dari bash daripada hack)sumber
Ini adalah pertanyaan lama, tapi saya sangat terkejut saya tidak melihat trik ini di sini
Alih-alih menggunakan cd Anda bisa menggunakan
Tidak perlu membuat subshell atau menggunakan alias.
Perhatikan bahwa Anda bertanggung jawab untuk memastikan / path / Anda / inginkan ada.
sumber
Seperti yang dijelaskan pada jawaban lain, Anda telah mengubah direktori, tetapi hanya di dalam sub-shell yang menjalankan skrip . ini tidak memengaruhi shell induk.
Salah satu solusinya adalah menggunakan fungsi bash alih-alih skrip bash (
sh
); dengan menempatkan kode skrip bash Anda ke suatu fungsi. Itu membuat fungsi tersedia sebagai perintah dan kemudian, ini akan dieksekusi tanpa proses anak dan dengan demikiancd
perintah apa pun akan berdampak pada shell penelepon.Fungsi bash:
Salah satu fitur dari profil bash adalah untuk menyimpan fungsi kustom yang dapat dijalankan di terminal atau dalam skrip bash dengan cara yang sama Anda menjalankan aplikasi / perintah ini juga dapat digunakan sebagai jalan pintas untuk perintah yang panjang.
Untuk membuat sistem Anda berfungsi efisien secara luas, Anda perlu menyalin fungsi Anda di akhir beberapa file
Anda dapat
sudo kwrite /home/user/.bashrc /home/user/.bash_profile /root/.bashrc /root/.bash_profile
mengedit / membuat file-file itu dengan cepatHowto:
Salin kode skrip bash Anda di dalam fungsi baru di akhir file profil bash Anda dan mulai ulang terminal Anda, Anda kemudian dapat menjalankan
cdd
atau apa pun fungsi yang Anda tulis.Contoh Skrip
Membuat pintasan
cd ..
dengancdd
ls jalan pintas
ls jalan pintas
sumber
Anda dapat menjalankan beberapa baris dalam subkulit yang sama jika Anda mengakhiri garis dengan garis miring terbalik.
sumber