Anda selalu dapat menggunakan symlink karena /bin/sh, dalam kebanyakan kasus di linux, ini sudah menjadi symlink bash. Hanya saja banyak skrip menggunakan hardcoded/bin/sh
cylgalad
5
Sekarang setelah Anda memiliki jawaban bahwa ia dapat hidup di mana saja yang Anda inginkan, Anda dapat bertanya pada diri sendiri: bagaimana Anda kemudian bisa menulis kalimat shebang sh? Dan jawabannya adalah: shebang juga bukan bagian dari POSIX, jadi masalahnya bahkan tidak muncul dengan sendirinya.
Jörg W Mittag
1
@ JörgWMittag Ya, terkadang mengejutkan betapa banyak hal yang kita anggap sebagai fitur "standar" Unix yang sebenarnya tidak diperlukan oleh POSIX.
Barmar
1
Apakah Anda menggunakan shebang atau tidak bergantung pada apakah path /bin/shharus ada pada sistem POSIX.
chepner
Setidaknya pada sistem yang diturunkan Ubuntu, /bin/shadalah tautan ke dash. Pada BSD, /bin/shitu bukan tautan tetapi dieksekusi terpisah, dan tentu saja tidak bash.
Rhialto mendukung Monica
Jawaban:
22
POSIX hanya mengamanatkan /devdan /tmpdirektori untuk eksis , dan /dev/null, /dev/tty, dan /dev/consolefile. Utilitas standar harus ada, tetapi tidak ada lokasi tertentu yang ditentukan. Mungkin tidak ada /binsama sekali, dan jika ada mungkin tidak mengandung sh, dan jika itu tidak mungkin POSIX sh.
Anda bisa mendapatkan PATHvariabel yang valid yang mencakup alat POSIX, termasuk sh, dengan getconfperintah :
Re Solaris: ... kecuali Anda menjalankan instalasi "server kecil" Solaris, yang menghilangkan banyak alat POSIX. Lihat unix.stackexchange.com/q/360359/135943
Wildcard
Yang "tidak berguna"? Saya lebih suka menyebutnya redundan.
Mukesh Sai Kumar
2
jadi bagaimana getconf ditemukan?
Joshua
@MukeshSaiKumar perintah 'cd' yang berdiri sendiri tidak akan pernah berfungsi
OrangeDog
Yah, itu akan "bekerja" hanya untuk nilai kerja yang, katakanlah, menguji apakah Anda dapat mengubah ke direktori, tetapi tidak benar-benar meninggalkan proses yang memanggilnya di sana. Itu lebih fungsional daripada tidak sama sekali.
Charles Duffy
12
Tidak, tidak perlu shmasuk /bin. Secara eksplisit mengutip /bin, /usr/bindan /usr/xpg4/binmungkin lokasi. Spesifikasi POSIX hanya mensyaratkan bahwa shada di PATH.
Aplikasi harus mencatat bahwa PATH standar untuk shell tidak dapat diasumsikan salah satu /bin/shatau /usr/bin/sh, dan harus ditentukan dengan interogasi PATH yang dikembalikan oleh getconf PATH, memastikan bahwa pathname yang dikembalikan adalah pathname absolut dan bukan built-in shell.
Misalnya, untuk menentukan lokasi utilitas standar sh:
Seperti yang dikatakan orang lain di sini, ini tidak sepenuhnya diperlukan untuk kepatuhan POSIX.
Tetapi kompatibilitas dengan perangkat lunak yang ada bisa dibilang jauh lebih penting (setelah semua, tujuan POSIX adalah untuk membuat hal-hal tertentu bekerja pada semua sistem operasi yang sesuai) dan jika sebuah OS tidak menyediakan waktu /bin/sh, itu akan merusak beberapa hal.
Cara lain yang beberapa implementasi historis menangani skrip shell adalah dengan mengenali dua byte pertama file sebagai string karakter "#!" dan menggunakan sisa baris pertama file sebagai nama penerjemah perintah untuk dieksekusi.
Tetapi jika itu tidak didukung, banyak perangkat lunak yang ada akan rusak atau membutuhkan pekerjaan tambahan untuk port.
/bin/sh
, dalam kebanyakan kasus di linux, ini sudah menjadi symlinkbash
. Hanya saja banyak skrip menggunakan hardcoded/bin/sh
sh
? Dan jawabannya adalah: shebang juga bukan bagian dari POSIX, jadi masalahnya bahkan tidak muncul dengan sendirinya./bin/sh
harus ada pada sistem POSIX./bin/sh
adalah tautan kedash
. Pada BSD,/bin/sh
itu bukan tautan tetapi dieksekusi terpisah, dan tentu saja tidakbash
.Jawaban:
POSIX hanya mengamanatkan
/dev
dan/tmp
direktori untuk eksis , dan/dev/null
,/dev/tty
, dan/dev/console
file. Utilitas standar harus ada, tetapi tidak ada lokasi tertentu yang ditentukan. Mungkin tidak ada/bin
sama sekali, dan jika ada mungkin tidak mengandungsh
, dan jika itu tidak mungkin POSIXsh
.Anda bisa mendapatkan
PATH
variabel yang valid yang mencakup alat POSIX, termasuksh
, dengangetconf
perintah :Ini dapat berguna pada, misalnya, Solaris, di mana standarnya
sh
tidak kompatibel dengan POSIX , tetapi yang memenuhish
syarat disediakan dan dapat diakses dengan cara itu (karena Solaris adalah Unix yang tersertifikasi ).getconf PATH
akan menyertakan/usr/xpg4/bin
di bagian depan, yang berisi POSIXsh
dan sejumlah alat lain yang diperlukan ( termasuk yang tidak berguna seperticd
).sumber
Tidak, tidak perlu
sh
masuk/bin
. Secara eksplisit mengutip/bin
,/usr/bin
dan/usr/xpg4/bin
mungkin lokasi. Spesifikasi POSIX hanya mensyaratkan bahwash
ada di PATH.The POSIX spesifikasi negara:
sumber
Seperti yang dikatakan orang lain di sini, ini tidak sepenuhnya diperlukan untuk kepatuhan POSIX.
Tetapi kompatibilitas dengan perangkat lunak yang ada bisa dibilang jauh lebih penting (setelah semua, tujuan POSIX adalah untuk membuat hal-hal tertentu bekerja pada semua sistem operasi yang sesuai) dan jika sebuah OS tidak menyediakan waktu
/bin/sh
, itu akan merusak beberapa hal.Paling jelas, skrip dengan
#!/bin/sh
mengandalkan jalur ini sedang distandarisasi. Ini tidak diharuskan untuk bekerja; POSIX bahkan tidak mensyaratkan bahwa#!
baris didukung, meskipun menyebutkan bahwa fungsi seperti itu umum :Tetapi jika itu tidak didukung, banyak perangkat lunak yang ada akan rusak atau membutuhkan pekerjaan tambahan untuk port.
sumber