Apakah "sh" harus ada di direktori "/ bin"?

16

Saya telah membaca bahwa sistem operasi yang sesuai dengan POSIX (misalnya: Linux) harus memiliki shshell.

Tetapi apakah itu diperlukan untuk shberada di /bindirektori, atau dapatkah itu ada di direktori mana pun?

pengguna270294
sumber
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 :

$ PATH=$(getconf PATH)
$ sh

Ini dapat berguna pada, misalnya, Solaris, di mana standarnya shtidak kompatibel dengan POSIX , tetapi yang memenuhi shsyarat disediakan dan dapat diakses dengan cara itu (karena Solaris adalah Unix yang tersertifikasi ). getconf PATHakan menyertakan /usr/xpg4/bindi bagian depan, yang berisi POSIX shdan sejumlah alat lain yang diperlukan ( termasuk yang tidak berguna seperticd ).

Michael Homer
sumber
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.

The POSIX spesifikasi negara:

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:

command -v sh

Pada beberapa implementasi ini mungkin kembali:

/usr/xpg4/bin/sh

John1024
sumber
2

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/shmengandalkan jalur ini sedang distandarisasi. Ini tidak diharuskan untuk bekerja; POSIX bahkan tidak mensyaratkan bahwa #!baris didukung, meskipun menyebutkan bahwa fungsi seperti itu umum :

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.

Ian D. Scott
sumber