Apakah ada sh
kode yang tidak valid secara sintaksis kode bash (tidak akan muntah di sintaks)?
Saya berpikir untuk menimpa sh
dengan bash
perintah tertentu.
bash
shell-script
posix
Alexander Mills
sumber
sumber
((
terlintas dalam pikiran./usr/bin/sh
hanyalah sym-link ke/usr/bin/bash
(Saya menggunakan CentOS 7.3 dan itu). Anda harus memeriksa apakahsh
benarbash
- benar untuk distro Anda.#!/bin/sh
menjadi#!/bin/bash
. Kemudian semuanya bekerja lagi, jadi Anda benar-benar harus berhati-hati. Itu mungkin terjadi ketika mereka mulai menggunakan tanda hubung bukan bash untuk sh.Jawaban:
Berikut adalah beberapa kode yang melakukan sesuatu yang berbeda di POSIX sh dan Bash:
Apakah itu "tidak valid" untuk Anda, saya tidak tahu.
Di Bash, ini mengarahkan ulang output standar dan kesalahan standar dari
hello
ke fileworld
. Dalam POSIXsh
, ini berjalanhello
di latar belakang dan kemudian membuat pengalihan kosong keworld
, memotongnya (yaitu diperlakukan sebagai& >
).Ada banyak kasus lain di mana ekstensi Bash akan melakukan hal mereka ketika dijalankan di bawah
bash
, dan akan memiliki efek yang berbeda dalam POSIX murnish
. Sebagai contoh, ekspansi brace adalah hal lain, dan itu juga beroperasi sama di bawah mode POSIX Bash dan tidak.Sejauh kesalahan sintaks statis berjalan, Bash memiliki kata-kata yang dicadangkan (seperti
[[
dantime
) tidak ditentukan oleh POSIX, sedemikian sehingga[[ x
merupakan kode shell POSIX yang valid tetapi kesalahan sintaks Bash, dan riwayat berbagai bug inkompatibilitas POSIX yang dapat mengakibatkan kesalahan sintaksis, seperti yang dari pertanyaan ini :Sintaks-kesalahan-saja adalah definisi yang cukup berbahaya dari "tidak valid" untuk keadaan apa pun yang penting, tetapi ada itu.
sumber
{fd}>file
masalah serupa), sehingga bash dapat menjadi serupa lagi (ekspansi brace akan tetap tidak ditentukan, tetapi skrip yang patuh perlu lakukanecho "{a,b}"
adalah mereka ingin{a,b}
menjadi keluaran). Lihat diskusi yang memulainya/bin/sh
bash, jadi jika saya tidak secara aktif menyadari bashism ini, menulis baris perintah ini dapat dengan mudah terjadi. Jarak dalam jawaban membuatnya tampak tidak mungkin, tetapihello&>world
tidak terlalu mengada-ada.&>
perbedaannya bulan lalu!Contoh singkat:
time
di Bash adalah kata yang dilindungi undang-undang, dan berperilaku berbeda daritime
program. Sangat mungkin Anda akan memecahkan beberapa skrip praktis yang mencoba mengurai hasiltime
dengan menggunakan bash. Tetapi secara teknis itu bukan kesalahan sintaksis. Mendefinisikan ulangtime
sebagai suatu fungsi akan jarang tetapi menyebabkan kesalahan sintaksis sebagaimana ditentukan oleh pertanyaan ini.Contoh yang lebih pendek:
Berlaku
dash
, tetapi tidak memenuhi syarat POSIX.sumber
time
, ada hal-hal sepertideclare
,function
,select
, dancoproc
. Meskipun beberapa dari mereka secara eksplisit ditandai sebagai tidak ditentukan dalam standar ( kata kunci dan bawaan / utilitas ), tetapi saya tidak dapat melihat misalnyatime
ataucoproc
dalam daftar. Dan menggunakan--posix
sepertinya tidak membantu.