Berbagai cara menjalankan binari dan skrip

11

Saya telah menggunakan Linux untuk beberapa waktu sekarang dan saya telah mencari gambaran lengkap tentang ini tetapi tidak menemukan apa pun.

Saya hanya tidak setuju dengan semua cara yang berbeda dalam mengeksekusi skrip dan binari - itu semua berantakan bagi saya dan saya harus menggunakan trial-and-error untuk menentukan apa yang harus saya gunakan. Untuk file yang merupakan skrip atau biner <script/binary>, saya dapat menemukan alternatif berikut:

<script/binary>
. <script/binary>
./<script/binary>
source <script/binary>
sh <script/binary>

(Apakah ada lagi?)

Dapatkah seseorang memberikan gambaran lengkap tentang perintah apa yang bekerja dengan jenis file apa, dan apa bedanya ketika ada beberapa opsi?

Terima kasih.

Carl
sumber

Jawaban:

7

Perintah berikut ini sama, komponen titik berarti "direktori saat ini". Untuk memungkinkan eksekusi, file harus memiliki izin yang dapat dieksekusi:

path/to/binary
./path/to/binary

Perhatikan bahwa jika jalan tidak mengandung garis miring, itu diperlakukan sebagai perintah (baik shell built-in atau program yang dicari dalam $PATHvariabel lingkungan).

Berikut ini hampir sama, mereka mengeksekusi skrip shell (bukan biner!) Di lingkungan shell saat ini. Perbedaan kecil antara kedua baris dijelaskan pada pertanyaan Unix.SE ini .

. path/to/script
source path/to/script

Akhirnya kamu menyebutkan sh script. Sekali lagi, ini hanya berfungsi untuk skrip shell dan bukan binari. Anda pada dasarnya menjalankan shprogram dengan nama skrip sebagai argumen. Dalam kasus sh, itu hanya memperlakukan argumen ini sebagai skrip shell dan menjalankannya.

Untuk jawaban yang terbatas pada skrip shell , lihat Berbagai cara untuk menjalankan skrip shell .

Lekensteyn
sumber
3

Terima kasih atas semua masukannya. Saya akan mencoba menjawab pertanyaan saya sendiri sekarang dan memberikan panduan lengkap untuk berbagai kemungkinan untuk mengeksekusi skrip dan binari. Harap edit dan komentar dan kami akan dapat menemukan sesuatu yang lengkap dan benar. Inilah saran saya:

Pada awalnya, dua poin untuk disebutkan:

  • Linux membuat perbedaan antara perintah dan jalur . Sebuah perintah hanya diketik sebagai-adalah pada prompt, dan akan mengeksekusi built-in atau akan menyebabkan Linux untuk mencari biner atau script pada $ PATH.

  • Agar Linux dapat menafsirkan sesuatu sebagai jalur, ia harus mengandung setidaknya satu garis miring (/). Misalnya dalam ./myScript, ./bisa tampak sangat berlebihan - itu ada di sana hanya untuk membuat Linux menafsirkannya sebagai jalur daripada perintah.

Jadi, opsi untuk mengeksekusi biner atau skrip:

Menjalankan biner binary:

$ binary          # when 'binary' is on the PATH, or is a built-in
$ ./binary        # when 'binary' is not on the path but in the current directory
$ /home/me/binary # when 'binary' is not on the PATH, and not in the current dir

Menjalankan skrip script:

File harus memiliki izin menjalankan kecuali dinyatakan sebaliknya.

$ script        # execute a script that is on PATH. Will be executed in a new shell.
                # The interpreter to use is determined by the she-bang in the file.
$ ./script      # execute a script that is in the current dir. Otherwise as above.
$ /a/dir/script # when the script is not on the PATH and not in current dir. 
                # Otherwise as above.
$ . script      # execute a script in the current dir. Will be executed in the
                # current shell environment.
$ source script # equivalent to the above *1
$ sh script     # executes 'script' in a new shell *2 (the same goes for 'bash ...',
                # 'zsh ...' etc.). Execute permission not neccessary.

Tentang she-poni :

Skrip dengan she-bang (mis #!/bin/sh) pada baris pertama memberitahu penerjemah mana yang akan digunakan.

  • Penerjemah ini akan digunakan ketika dieksekusi oleh ./scriptatau menggunakan perintah: script( scriptharus ada di PATH)
  • Menggunakan sh scriptakan mengabaikan she-bang dan menggunakan, dalam hal ini, shsebagai penerjemah
  • Menggunakan . scriptatau sourceakan mengabaikan she-bang dan menggunakan penerjemah saat ini (karena .atau sourcesetara dengan hanya mengeksekusi setiap baris skrip dalam shell saat ini)

Catatan kaki

* 1: Ini hampir benar. Dalam bash mereka memang perintah yang sama, tetapi saat menggunakan source, scriptakan dicari dalam $ PATH sebelum dir saat ini. Itu bash, tetapi dalam shell POSIX-only, sourcetidak bekerja, tetapi .tidak. Jadi alih-alih gunakan yang terakhir untuk portabilitas.

* 2: yang sebenarnya terjadi adalah kita menjalankan binary sh dengan 'script' sebagai argumen, yang akan membuat 'sh' mengeksekusi 'script' di shell baru

Carl
sumber
2

Berikut daftar perintah yang cepat. Catatan, ketika saya menyebutkan PATH, maksud saya direktori yang berisi program yang diketahui sistem; Anda menemukan mereka dengan echo $PATH, dan itu akan menjadi sesuatu seperti:/home/mike/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Skrip

  • Untuk menjalankan skrip di direktori kerja saat ini, gunakan ./myscript.sh
  • Untuk menjalankan skrip pada file lain, gunakan (jika ada di direktori kerja saat ini), ./myscript.sh textfile.txt
  • Skrip juga dapat dijalankan dengan argumen; seperti yang dijelaskan dalam Rute (hal. 68): myfile.sh dogs cats birdsakan ditampilkan The first argument is: dogs, second argument is: cats, third argument is: birdskarena isi skrip ini setelah shebang adalah:echo "The first argument is: $1, second argument is: $2, third argument is: $3"

  • Untuk menjalankan skrip di direktori lain, gunakan ~/Scripts/dogs.sh

  • Untuk menjalankan skrip yang diketahui oleh sistem karena berada di folder bin Anda di direktori home Anda (cukup buat jika tidak ada, karena akan secara otomatis ditambahkan ke PATH Anda), cukup gunakan scriptname
  • Untuk menjalankan skrip yang telah Anda instal, sekali lagi gunakan saja namanya, karena itu akan diketahui oleh sistem: misalnya, get_iplayer

Binari

  • Untuk menjalankan biner yang diketahui oleh sistem karena menggunakan $ PATH, gunakan nama program dan parameter apa pun, misalnya, vlc <stream url to open>
  • Untuk menguji biner yang telah Anda kompilasi sebelum menginstal ke / usr / local / bin, atau untuk menjauhkan program mandiri dari sistem, gunakan ~/<folder>/app/myprog

sumber
Terima kasih atas informasinya. Apakah pernyataan ini benar: Untuk menjalankan skrip atau biner yang tidak ada dalam PATH, cukup tentukan path-nya. Alasan ./ diperlukan untuk skrip di jalur saat ini adalah bahwa 'skrip.sh' hanya akan ditafsirkan sebagai perintah karena tidak memiliki setidaknya satu garis miring /.
Carl
"Untuk menjalankan skrip yang telah Anda instal", apakah skrip yang saya "instal"? Apakah poin ini mengatakan hal yang sama dari poin sebelumnya?
Carl
@ Carl- komentar pertama Anda benar, tetapi tidak benar untuk mengatakan bahwa dua poin terakhir saya tentang skrip adalah sama. Pada poin 5 dari bagian skrip saya berbicara tentang skrip yang telah ditambahkan pengguna secara manual ke folder bin mereka di direktori home mereka; pada poin 6 saya berbicara tentang skrip seperti get_iplayer yang telah mereka instal dari repositori dan karena itu selalu masuk ke folder sistem, bukan ke direktori home pengguna.
Maaf tapi saya masih tidak mengerti itu, skrip di ~ / bin / (yang ada di PATH) atau di folder sistem (yang ada di PATH) - bagaimana mungkin ada perbedaan di antara mereka? Apakah mereka berperilaku berbeda?
Carl
Saya baru saja membuat perbedaan antara skrip yang dimiliki dan ditambahkan oleh pengguna di ~ / bin dan skrip yang dimiliki oleh root di folder sistem.