Menjalankan skrip dari direktori lain

11

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 sudodalam kasus seperti itu? Ini, misalnya, tidak berfungsi:

sudo . /path/to/script
Desmond Hume
sumber
Ketahuilah bahwa . /path/to/script sumber skrip! Anda tidak perlu periode sama sekali jika Anda hanya ingin menjalankannya.
gniourf_gniourf

Jawaban:

14

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 memanggil exitmisalnya, 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:

$(cd /wherever/ ; sh script.sh)
Ярослав Рахматуллин
sumber
3
Apakah yang Anda maksud (cd /wherever/ ; sh script.sh)? Mengapa Anda punya $di depan?
G-Man Mengatakan 'Reinstate Monica'
7

Anda pasti bisa melakukan itu (dengan penyesuaian yang disebutkan sudo sh /pathto/script.shatau 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

ln -s /home/username/Scripts/name.sh /usr/bin/name

(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_profilemenambahkan sesuatu seperti:

alias l="ls -l"

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, hanya alias sl="sudo ls -l"untuk catatan untuk diri sendiri l vs sl (sebagai contoh tidak berguna).

Either way, Anda bisa mengetik sudo nameofscriptdan berada di jalan Anda. Tidak perlu dipusingkan dengan ./ atau. atau sh, dll. Tandai saja sebagai yang dapat dieksekusi terlebih dahulu: D

nerdwaller
sumber
Saya akan sangat merekomendasikan opsi 2.
Bernhard
Kenapa ?, ini praktik terbaik atau hanya rasa?
Sergio
3

Saya biasanya suka Anda katakan

sh /path/to/script

Dan untuk menjalankannya sebagai root / superuser

sudo sh /path/to/script

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.

Bolli
sumber
tidak akan berfungsi jika secure_path diatur dalam file / etc / sudoers
l1zard
3

Saya biasanya menyimpan skrip saya di /usr/local/binatau /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/.bashrcfile Anda dan menambahkan baris ini:

export PATH=$PATH:/usr/local/sbin:/usr/local/bin

Jika Anda ingin dapat menjalankan skrip sebagai root via sudo, Anda harus menambahkan direktori ini ke variabel secure_pathdi /etc/sudoers.

Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

Mengedit file ini dilakukan dengan menjalankan visudoyang memastikan Anda tidak memiliki kesalahan.

lzard
sumber
Typo: maksud Anda .bashrcalih-alih .bachrc.
gniourf_gniourf
0

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.

Codezilla
sumber
0

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.

alias run-script="cd /home/user/path/to/script/ && bash script.sh"

Dengan cara ini Anda tidak perlu mengubah apa pun untuk membuatnya berfungsi.

EvR2f
sumber
0

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.

# Place this somewhere in your .bashrc/.bash_profile/etc and edit as you see fit

YOURCOMMAND () {
  cd /path/to/directory/containing/your/script/ && ./YOURSCRIPT
}

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.

AnonimX
sumber
-1

Pertanyaan kuno, tapi pertanyaan abadi.

Solusi yang secara konsisten saya lihat adalah memiliki $HOME/bindirektori dan memasukkannya terlebih dahulu $PATH(via ~/.bashrcjika belum ada; pada beberapa sistem ~/binpertama-tama $PATHsecara 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_SOURCEdigunakan. $BASH_SOURCEselalu berisi jalur absolut ke skrip yang sedang berjalan itu sendiri, apa pun nilainya $PWD.

Pertimbangkan yang berikut ini:

ceverett@burrito:~$ echo $PATH
/home/ceverett/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

Jadi kita bisa melihat yang $HOME/binpertama masuk $PATH, jadi apa pun yang saya masukkan ~/binakan berjalan. Saya memiliki skrip demonstrasi bernama ~/bin/findme:

#!/bin/bash

echo "Running from $BASH_SOURCE"

Ini dapat digunakan untuk mendapatkan jalur absolut ke lokasi skrip yang sedang berjalan.

ceverett@burrito:~$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~$ cd foo
ceverett@burrito:~/foo$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~/foo$ cd /
ceverett@burrito:/$ findme
Running from /home/ceverett/bin/findme
zxq9
sumber
(1) Meskipun ini tampaknya informasi yang berguna, pertanyaan itu tidak menanyakan cara menulis skrip yang menggunakan sumber daya relatif terhadap lokasi mereka sendiri; ia bertanya tentang menjalankan skrip. (2) Saya tidak yakin bagaimana paragraf kedua Anda menjawab pertanyaan. Apakah Anda menyarankan bahwa, jika saya menulis skrip dan Desmond ingin menjalankannya, ia harus menautkannya ke bindirektori pribadinya ? Tampaknya rumit. (3) Juga, itu melanggar independensi lokasi. Jika /home/desmond/bin/footautan ke skrip saya, maka BASH_SOURCEakan menjadi /home/desmond/bin/foo, dan skrip tidak akan dapat menemukan sumber dayanya.
G-Man Mengatakan 'Reinstate Monica'
@ G-Man (1) Pengguna tidak memberikan banyak konteks. Setiap kali pertanyaan ini ditanyakan kepada saya selama 30 tahun terakhir, selalu dalam konteks pengguna (biasanya sysop atau pengembang baru) menjalankan campuran skrip sendiri dan skrip lain yang diperoleh untuk mengotomatiskan tugas-tugas sepele, jadi saya menjawabnya bahwa cara. Ini memang mengasumsikan sedikit pengetahuan scripting pada bagian dari permintaan pengguna. (2) Skrip sistem biasanya dipasang di /binatau lokasi yang dikenal di /opt. (3) Kemandirian lokasi adalah hal yang dipertahankan saat menulis kumpulan skrip pribadi yang saling tergantung.
zxq9