Saya tahu bahwa saya bisa menggunakan skrip baris pertama untuk menjalankan shell yang diinginkan.
Akan #!/bin/sh
direkomendasikan jika kompatibilitas dengan semua sistem unix adalah persyaratan mutlak?
Dalam kasus saya, satu-satunya OS yang saya pedulikan adalah Ubuntu (Debian) dan OSX. Mengingat itu, dapatkah saya menggunakan #!/bin/bash
dan yakin itu akan bekerja pada kedua sistem?
Apakah ini juga akan membuatnya lebih mudah untuk menggunakan skrip dengan sintaks yang lebih modern dan lebih jelas untuk perintah? Apakah menggunakan #!/bin/sh
juga berhubungan dengan menggunakan POSIX?
/bin
dan/usr/bin
. Akibatnya, mungkin lebih baik digunakan#!/usr/bin/env <shname>
untuk portabilitas akhir-akhir ini.Jawaban:
Sebagai permulaan, jika Anda dapat membuat asumsi bahwa Bash sudah diinstal sebelumnya (yang, setahu saya adalah kasus pada semua sistem yang Anda daftarkan), gunakan hashbang berikut agar kompatibel:
ini memanggil apa pun yang
bash
terjadi untuk dikonfigurasi, tidak peduli apakah itu dalam/bin
atau/usr/local/bin
.Sementara pada kebanyakan sistem di berbagai (termasuk AIX, Solaris, beberapa rasa BSD),
bash
berakhir di lokasi yang berbeda,env
selalu berakhir pada/usr/bin/env
. Triknya, bagaimanapun, bukan milikku tetapi dari penulis Bash Cookbook.Bagaimanapun, ya Bash akan memungkinkan Anda untuk menggunakan beberapa fitur "modern" yang membuat hidup Anda lebih mudah.
Misalnya tanda kurung ganda:
sedangkan dalam dialek shell tradisional Anda harus menggunakan:
tetapi yang terbaik tentang tanda kurung ganda adalah mereka memungkinkan ekspresi reguler untuk dicocokkan. The Bash Hacker Wiki akan memberikan banyak trik arah itu.
Anda juga dapat menggunakan ekspresi yang cukup nyaman seperti
$((2**10))
atau ekspresi aritmatika lainnya sesuai dengan$((expression))
sintaks.Menggunakan backticks untuk subkulit baik-baik saja, meskipun agak ketinggalan jaman. Tetapi kemampuan bersarang dalam
$(command ...)
doa jauh lebih nyaman karena Anda tidak perlu melarikan diri dari banyak hal pada tingkat subkulit yang berbeda.Ini hanyalah beberapa hal yang Bash berikan kepada Anda atas
sh
sintaks POSIX umum yang umum .Tetapi jika Anda ingin lebih banyak kekuatan pada shell (tidak hanya dalam skrip), lihat juga
zsh
.sumber
sh
tugas-tugas tersebut.sh
ditautkanbash
, kerentanan tidak akan dikurangi dengan menggunakansh
.Di Debian dan Ubuntu,
/bin/sh
adalahdash
, yang merupakan shell yang sesuai dengan POSIX. Jika Anda menentukan#!/bin/sh
, Anda harus membatasi diri pada pernyataan POSIX dalam skrip Anda. (Keuntungannya adalahdash
mulai lebih cepat daripadabash
, sehingga skrip Anda dapat menyelesaikan tugasnya dalam waktu yang lebih singkat.)Pada banyak (kebanyakan?) Sistem Linux lainnya,
/bin/sh
adalahbash
, yang mengapa banyak script yang ditulis dengan#!/bin/sh
sebagai garis peristiwa mereka meskipun mereka menggunakanbash
ekstensi.Jika Anda ingin menggunakan
bash
ekstensi, pendekatan teraman pada semua sistem adalah menentukan#!/bin/bash
; dengan cara itu Anda secara eksplisit menyatakan ketergantungan Andabash
. Anda perlu melakukan ini di Debian dan Ubuntu. Sebagai bonus tambahan, ketika dimulai sebagai/bin/sh
bash
menonaktifkan beberapa ekstensi (lihat deskripsibash
mode POSIX untuk detail); jadi#!/bin/bash
perlu menentukan untuk mendapatkan manfaat penuh daribash
.Pada OS X
/bin/bash
juga tersedia, dan/bin/sh
inibash
. Menentukan#!/bin/bash
akan bekerja dengan baik di sana juga.sumber
Ya, baik OSX dan Linux akan datang dengan
/bin/bash
. Anda harus benar-benar aman. Namun, itu bukan POSIX. Shell POSIX berada/bin/sh
pada sebagian besar (semua?) Sistem dan itu adalah pendekatan yang paling portabel dan satu-satunya cara agar kompatibel dengan POSIX.Perhatikan bahwa sementara pada banyak sistem
/bin/sh
menunjuk kebash
, pada yang lain itu dapat menunjuk ke shell berbeda. Ini adalah symlink kedash
pada Debian dan Ubuntu misalnya. Juga, meskipun/bin/sh
merupakan tautan kebash
, perilaku shell berubah ketika disebut sebagaish
(dariman bash
, penekanan milikku):sumber
Jika kompatibilitas dengan "semua sistem Unix" adalah persyaratan mutlak - dan jika tidak, mengapa Anda menulis skrip shell? - maka, ya, Anda harus menggunakan
#! /bin/sh
, karena Bash tidak dijamin dipasang di mana saja , apalagi masuk/bin
.Sebenarnya jauh lebih buruk dari itu. Jika Anda memerlukan kompatibilitas untuk semua sistem Unix, itu termasuk hal-hal seperti Solaris dan AIX yang membekukan lingkungan shell mereka sekitar tahun 1995. Yang berarti Anda harus menggunakan hal-hal seperti
sort +N
sintaks kuno - bahwa sistem yang lebih baru telah jatuh! Dan itu juga berarti tidak ada fungsi shell, tidak ada array, tidak[[ ... ]]
, tidak${foo#glob}
, tidak$(( ... ))
untuk aritmatika, mungkin tanpa$( ... )
substitusi perintah gaya, batas atas kecil dan tidak berdokumen tentang seberapa besar input yang bisa didapat, ...Anda mungkin bisa lolos dengan tidak mengganggu dengan yang banyak kompatibilitas, tetapi jika itu bahkan masalah di tempat pertama, saya sangat menyarankan Anda mempertimbangkan bahasa yang kurang mengerikan daripada shell. Interpreter Perl dasar lebih mungkin tersedia daripada Bash.
sumber