Cukup sering, skrip yang ingin saya jalankan tidak terletak di direktori kerja saya saat ini dan saya tidak benar-benar ingin meninggalkannya.
Apakah ini praktik yang baik untuk menjalankan skrip (BASH, Perl dll.) Dari direktori lain? Apakah mereka biasanya menemukan semua barang yang mereka butuhkan untuk berjalan dengan baik?
Jika demikian, apa cara terbaik untuk menjalankan skrip "jauh"? Apakah itu
. /path/to/script
atau
sh /path/to/script
dan bagaimana menggunakannya sudo
dalam kasus seperti itu? Ini, misalnya, tidak berfungsi:
sudo . /path/to/script
. /path/to/script
sumber skrip! Anda tidak perlu periode sama sekali jika Anda hanya ingin menjalankannya.Jawaban:
sh / path / ke / script akan menelurkan shell baru dan menjalankan script dia terlepas dari shell Anda saat ini. Perintah
source
(.) Akan memanggil semua perintah dalam skrip di shell saat ini. Jika skrip memanggilexit
misalnya, maka Anda akan kehilangan shell saat ini. Karena ini, biasanya lebih aman untuk memanggil skrip dalam shell yang terpisah dengan sh atau untuk mengeksekusinya sebagai binari menggunakan penuh (dimulai dengan /) atau path relatif (./). Jika disebut sebagai binari, mereka akan dieksekusi dengan juru bahasa yang ditentukan (#! / Bin / bash, misalnya).Adapun mengetahui apakah suatu script akan menemukan file yang dibutuhkan, tidak ada jawaban yang baik, selain melihat script untuk melihat apa yang dilakukannya. Sebagai opsi, Anda selalu dapat membuka folder skrip dalam sub-proses tanpa meninggalkan folder Anda saat ini:
sumber
(cd /wherever/ ; sh script.sh)
? Mengapa Anda punya$
di depan?Anda pasti bisa melakukan itu (dengan penyesuaian yang disebutkan
sudo sh /pathto/script.sh
atau disukai orang lain./script.sh
). Namun, saya melakukan salah satu dari beberapa hal untuk menjalankannya secara luas agar tidak khawatir tentang dir dan menyelamatkan saya mengetik tambahan yang tidak berguna.1) Simbol ke
/usr/bin
(pastikan tidak ada nama yang tumpang tindih di sana, karena Anda jelas akan menimpanya.) Ini juga memungkinkan saya menyimpannya di folder pengembangan saya sehingga saya dapat menyesuaikan seperlunya.
2) Tambahkan skrip dir ke jalur Anda (menggunakan .bash_profile - atau apa pun. Profil yang Anda miliki di shell Anda)
PATH=/path/to/scripts/:$PATH
3) Buat Alias di
.bash_profile
dalam~/.bash_profile
menambahkan sesuatu seperti:Seperti yang Anda tahu, sintaksnya hanya alias, digit yang Anda inginkan untuk bertindak sebagai perintah, perintah. Jadi mengetik "l" di mana saja di terminal akan menghasilkan
ls -l
Jika Anda ingin sudo, hanyaalias sl="sudo ls -l"
untuk catatan untuk diri sendiri l vs sl (sebagai contoh tidak berguna).Either way, Anda bisa mengetik
sudo nameofscript
dan berada di jalan Anda. Tidak perlu dipusingkan dengan ./ atau. atau sh, dll. Tandai saja sebagai yang dapat dieksekusi terlebih dahulu: Dsumber
Saya biasanya suka Anda katakan
Dan untuk menjalankannya sebagai root / superuser
Direktori Anda saat ini hanya penting jika skrip mengasumsikan Anda berada di folder yang sama. Saya akan berasumsi sebagian besar skrip tidak melakukan ini dan Anda menyimpan untuk menjalankannya seperti di atas.
sumber
Saya biasanya menyimpan skrip saya di
/usr/local/bin
atau/usr/local/sbin/
(jika skrip membutuhkan root privilege) di mana, sesuai dengan Filesystem Hierarchy Standard (FHS), milik mereka.Yang harus Anda lakukan adalah memastikan dua direktori ini ditambahkan ke Anda
PATH
. Anda dapat melakukan ini dengan mengedit$HOME/.bashrc
file Anda dan menambahkan baris ini:Jika Anda ingin dapat menjalankan skrip sebagai root via
sudo
, Anda harus menambahkan direktori ini ke variabelsecure_path
di/etc/sudoers
.Mengedit file ini dilakukan dengan menjalankan
visudo
yang memastikan Anda tidak memiliki kesalahan.sumber
.bashrc
alih-alih.bachrc
.Saya tidak yakin ini berfungsi seperti ini di linux, dengan asumsi tidak jika tidak ada yang menyarankannya. Tetapi alih-alih menggunakan ././ untuk kembali ke direktori. Bisakah Anda menggunakan kutipan untuk memberikannya jalur absolut? Mungkin itu tidak memberi Anda akses ke seluruh drive untuk dapat melakukan hal yang benar-benar dipikirkan.
sumber
Jika Anda memiliki skrip yang perlu sering Anda jalankan, dan skrip bergantung pada lokasi mereka untuk menemukan sumber daya, Anda dapat dengan mudah melakukan ini dengan hanya menggabungkan perintah dalam alias seperti ini.
Dengan cara ini Anda tidak perlu mengubah apa pun untuk membuatnya berfungsi.
sumber
Tidak yakin mengapa tidak ada yang menyarankan yang ini, tapi ini sangat mudah! Saya telah mencari Google beberapa kali dan tidak dapat menemukan jawaban tepat yang saya berikan sehingga saya pikir saya akan membagikannya. IMO, ini tetapi solusi terbaik, juga yang termudah, bagi saya bagaimanapun, tetapi orang lain mungkin merasa dan melakukan sesuatu secara berbeda.
Pertama perintah 'cd' yang memberi tahu direktori lokasi skrip. Kemudian '&&' agar Anda dapat mengikatnya setelah mengecualikan perintah berikutnya. Terakhir buka skrip Anda seperti yang akan Anda lakukan dalam terminal! Disimpan Anda dalam file BASH Anda dan membutuhkan 5 detik untuk setup.
Semoga ini bisa membantu seseorang.
sumber
Pertanyaan kuno, tapi pertanyaan abadi.
Solusi yang secara konsisten saya lihat adalah memiliki
$HOME/bin
direktori dan memasukkannya terlebih dahulu$PATH
(via~/.bashrc
jika belum ada; pada beberapa sistem~/bin
pertama-tama$PATH
secara default). Menjatuhkan skrip di sana untuk eksekusi atau symlink ke skrip / executable di tempat lain adalah cara sederhana untuk menangani masalah jalur yang seharusnya tidak mempengaruhi sistem atau pengguna lain.Jika skrip membutuhkan sumber daya tambahan yang dapat ditemukan relatif terhadap lokasinya sendiri (tidak jarang) maka envvar
$BASH_SOURCE
digunakan.$BASH_SOURCE
selalu berisi jalur absolut ke skrip yang sedang berjalan itu sendiri, apa pun nilainya$PWD
.Pertimbangkan yang berikut ini:
Jadi kita bisa melihat yang
$HOME/bin
pertama masuk$PATH
, jadi apa pun yang saya masukkan~/bin
akan berjalan. Saya memiliki skrip demonstrasi bernama~/bin/findme
:Ini dapat digunakan untuk mendapatkan jalur absolut ke lokasi skrip yang sedang berjalan.
sumber
bin
direktori pribadinya ? Tampaknya rumit. (3) Juga, itu melanggar independensi lokasi. Jika/home/desmond/bin/foo
tautan ke skrip saya, makaBASH_SOURCE
akan menjadi/home/desmond/bin/foo
, dan skrip tidak akan dapat menemukan sumber dayanya./bin
atau lokasi yang dikenal di/opt
. (3) Kemandirian lokasi adalah hal yang dipertahankan saat menulis kumpulan skrip pribadi yang saling tergantung.