Pertanyaan Skrip Bash tidak akan berjalan tanpa mengetik "bash" di depannya


Di sistem sekolah kami, kami dapat menjalankan file skrip tanpa mengetik bash atau csh atau apa yang Anda tanpa menunjukkan jenis skrip apa itu. Di Ubuntu, saya harus mengetik bash script.bash sebagai contoh. Apakah ini selalu diperlukan di Ubuntu, atau apakah beberapa pengaturan dapat saya ubah?


10
2018-02-10 15:00


asal


apakah itu ditetapkan sebagai file yang dapat dieksekusi? - jsolarski
ya, file tersebut dapat dieksekusi, itulah mengapa saya akan berpikir itu akan berjalan sendiri. - muttley91
Kesalahan apa yang Anda dapatkan ketika Anda mengetik ./script? Apakah Anda yakin bahwa skrip tidak berubah dari editor Windows menempatkan char tambahan di akhir baris? Itu akan mematahkan baris pertama yang menunjukkan bahwa script harus dijalankan dengan bash. - João Pinto
Bagaimana Anda memulainya, dan apa errormessage itu? - user unknown
+1 untuk tidak menggunakan .sh untuk skrip bash. Umumnya ekstensi file tidak digunakan untuk skrip yang dapat dieksekusi di dunia UNIX. - nyuszika7h


Jawaban:


  1. Pastikan Anda memulai skrip dengan ./script atau jalur lengkap atau apa pun. Hanya script mungkin tidak berfungsi (berfungsi jika direktori aktif $PATH, suka /usr/bin), karena pada sistem UNIX itu bukan kebiasaan untuk memiliki direktori saat ini di jalan Anda (untuk alasan keamanan, dan itu bagus!)

  2. Pastikan skrip dapat dieksekusi, misalnya: chmod +x script akan membuatnya bisa dieksekusi.

  3. Pastikan, Anda punya #!/bin/bash sebagai baris pertama di skrip Anda. Juga pastikan, bahwa itu tidak diedit dengan beberapa jenis editor Windows, karena mereka sering menggunakan "jenis DOS" dari eol (akhir baris) yang berbeda dari yang UNIX (jika daftar periksa di atas OK, tetapi Anda punya "buruk interpreter: tidak ada file atau direktori semacam itu "atau lebih, bahkan jika itu / bin / bash, ini sering alasannya, karena tidak dapat dicetak - sehingga Anda biasanya tidak melihatnya - akan diperlakukan sebagai bagian dari jalur penerjemah)

Yang lain sudah disebutkan: penting untuk dimiliki /bin/bash jika Anda menggunakan fitur bash, juga /bin/sh diratakan ke /bin/bash, tetapi sekarang-a-hari (sejauh yang saya perhatikan) itu symlinked ke dash yang tidak akan menyediakan kompatibilitas bash, hanya POSIX sh. Ini cukup penting, bahkan software yang cukup mahal di perusahaan kami memiliki masalah ini: skrip mengandung #!/bin/sh sebagai baris pertama tetapi itu tergantung pada fungsi bash juga.


17
2018-02-10 15:52



Jadi saya harus menjalankannya seperti ini: ./script, seperti yang saya temukan. Ini lebih baik daripada mengetik "bash" setiap kali, dan itu masuk akal. Saya percaya saya tahu ini sebelumnya, itu hanya menyelipkan pikiran saya. Baiklah, terima kasih! - muttley91
Secara teori Anda dapat menempatkan direktori kerja saat ini ke dalam variabel PATH sehingga Anda dapat menggunakan hanya "skrip" daripada "./script" tetapi saya memperingatkan Anda: ini benar-benar bukan kebiasaan pada sistem UNIX dan itu bisa menjadi masalah keamanan ! Juga tidak baik di sekolah untuk mempelajari hal-hal dengan cara yang belum pernah menjadi solusi pada sistem UNIX, jadi saya akan menghindari solusi ini ... - LGB
Atau, lebih disukai, #!/usr/bin/env bash, yang sedikit lebih portabel. - Sparhawk


Pastikan baris pertama dari file tersebut berbunyi:

#!/bin/bash

Jika shebang itu #!/bin/sh, Anda tidak boleh menggunakan fitur khusus bash, hanya fitur POSIX. Bahkan jika /bin/sh adalah symlink ke bash, bash akan berjalan dalam mode kompatibilitas POSIX ketika dijalankan sebagai sh, menonaktifkan beberapa (tetapi tidak semua) fitur bash.

Anda juga harus memastikan skrip dapat dieksekusi, tentu saja.


4
2018-02-10 15:08



Tidak, saya mengaturnya untuk bash hanya keluar dari kebiasaan pula. - muttley91


Sebuah alternatif, sangat putus asa cara menambahkan . untuk PATH.

PATH=".:$PATH"

atau

PATH="$PATH:."

Masalah dengan pendekatan ini adalah bahwa dalam kasus sebelumnya, setiap perintah sistem dapat ditimpa dengan file yang dapat dieksekusi dari direktori saat ini, dan dalam kasus terakhir, perintah yang tidak diketahui masih dapat ditimpa.

Pertimbangkan yang berikut ini:

File: ls

#!/bin/bash

./my_malicious_script &>/dev/null
/bin/ls "$@"

Kemungkinan besar Anda bahkan tidak akan menyadari sampai terlambat.


0
2018-03-09 13:48



Pilihan kata agak menyesatkan di sini. Perintah tidak akan ditimpa. Jika Anda memiliki perintah dalam direktori kerja saat ini yang kebetulan memiliki nama yang sama dengan yang tinggal di direktori sistem, katakan echo misalnya, yang ada di direktori Anda akan digunakan hanya karena direktori itu diatur PATH variabel sebelum /bin. Shell hanya mencari perintah dalam direktori tertentu tergantung pada pesanan mereka PATH, dan tidak menimpa / menghancurkan apa pun. Tapi ya, ini punya implikasi - Sergiy Kolodyazhnyy