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

11

Di sistem sekolah kami, kami dapat menjalankan file skrip tanpa mengetik bashatau cshatau apa pun yang Anda miliki tanpa menunjukkan jenis skrip apa itu. Di Ubuntu, saya diminta mengetik bash script.bashmisalnya. Apakah ini selalu diperlukan di Ubuntu, atau itu beberapa pengaturan yang dapat saya ubah?

muttley91
sumber
1
apakah ini ditetapkan sebagai file yang dapat dieksekusi?
jsolarski
ya, file tersebut dapat dieksekusi, itulah mengapa saya akan berpikir itu hanya akan berjalan sendiri.
muttley91
1
Kesalahan apa yang Anda dapatkan saat mengetik ./script? Apakah Anda yakin skrip tidak diubah dari editor Windows yang menempatkan karakter tambahan di akhir baris? Itu akan mematahkan baris pertama yang menunjukkan bahwa skrip harus dijalankan dengan bash.
João Pinto
1
Bagaimana Anda memulainya, dan apa kesalahannya?
pengguna tidak diketahui
+1 untuk tidak menggunakan .shskrip bash. Namun, umumnya ekstensi file tidak digunakan untuk skrip yang dapat dieksekusi di dunia UNIX.
nyuszika7h

Jawaban:

17
  1. Pastikan Anda memulai skrip dengan ./scriptatau path lengkap atau apa pun. scriptMungkin saja tidak berfungsi (itu berfungsi jika direktori ada di $PATH, seperti /usr/bin), karena pada sistem UNIX itu bukan kebiasaan untuk memiliki direktori saat ini di jalur Anda (untuk alasan keamanan, dan itu bagus!)

  2. Pastikan skrip dapat dieksekusi, misalnya: chmod +x scriptakan membuatnya dapat dieksekusi.

  3. Pastikan, Anda memiliki #!/bin/bashsebagai baris pertama dalam skrip Anda. Juga pastikan, bahwa itu tidak diedit dengan semacam editor Windows, karena yang sering menggunakan "tipe DOS" dari eol (end of line) yang berbeda dari yang UNIX (jika daftar periksa di atas OK, tetapi Anda mendapat "buruk interpreter: tidak ada file atau direktori "atau lebih, bahkan jika itu / bin / bash, ini sering menjadi alasan, karena tidak dapat dicetak - jadi Anda biasanya tidak melihatnya - akan diperlakukan sebagai bagian dari jalur penerjemah)

Yang lain telah disebutkan: sangat penting untuk dimiliki /bin/bashjika Anda menggunakan fitur bash, juga /bin/shdikaitkan dengan /bin/bash, tetapi sekarang-a-hari (sejauh yang saya perhatikan) itu terhubung ke dashyang tidak akan memberikan kompatibilitas bash, hanya POSIX sh. Ini cukup penting, bahkan perangkat lunak yang cukup mahal di perusahaan kami memiliki masalah ini: skrip berisi #!/bin/shsebagai baris pertama tetapi tergantung pada fungsi bash juga.

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

Pastikan baris pertama file berbunyi:

#!/bin/bash

Jika shebang adalah #!/bin/sh, Anda tidak harus menggunakan fitur spesifik bash, hanya fitur POSIX. Bahkan jika /bin/shsymlink adalah untuk 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.

geirha
sumber
Tidak, saya mengaturnya untuk menghancurkan hanya karena kebiasaan.
muttley91
0

Alternatif, sangat kecewa dengan cara menambah .ke PATH.

PATH=".:$PATH"

atau

PATH="$PATH:."

Masalah dengan pendekatan ini adalah bahwa dalam kasus sebelumnya, perintah sistem apa pun bisa ditimpa dengan executable dari direktori saat ini, dan dalam kasus terakhir, perintah yang tidak diketahui masih bisa ditimpa.

Pertimbangkan yang berikut ini:

File: ls

#!/bin/bash

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

Kemungkinan besar Anda bahkan tidak akan menyadarinya sampai terlambat.

nyuszika7h
sumber
1
Pilihan kata sedikit menyesatkan di sini. Perintah tidak akan diganti. Jika Anda memiliki perintah di direktori kerja saat ini yang kebetulan memiliki nama yang sama dengan yang tinggal di direktori sistem, katakanlah echomisalnya, yang ada di direktori Anda akan digunakan hanya karena direktori tersebut diatur dalam PATHvariabel sebelum /bin. Shell hanya mencari perintah di direktori tertentu tergantung pada urutannya PATH, dan tidak menimpa / menghancurkan apa pun. Tapi ya, ini memiliki implikasi
Sergiy Kolodyazhnyy