Saya telah mengambil - mungkin di Usenet pada pertengahan 1990-an (!) - yang membangun
export var=value
adalah Bashism, dan ungkapan portabel itu
var=value
export var
Saya telah mengadvokasi ini selama bertahun-tahun, tetapi baru-baru ini, seseorang menantangku, dan saya benar-benar tidak dapat menemukan dokumentasi untuk mendukung apa yang dulunya merupakan kepercayaan kuat saya.
Googling untuk "export: command not found"
sepertinya tidak memunculkan kasus di mana seseorang benar-benar memiliki masalah ini, jadi meskipun itu asli, saya kira itu tidak terlalu umum.
(Hits saya mendapatkan tampaknya pemula yang menyalin / disisipkan tanda baca, dan berakhir dengan 'export: command not found
atau semacam, atau mencoba untuk menggunakan export
dengan sudo
, dan pemula csh
. Pengguna mencoba untuk menggunakan Bourne shell sintaks)
Saya pasti bisa mengatakan bahwa ia bekerja pada OS X, dan pada berbagai distro Linux, termasuk yang mana sh
adalah dash
.
sh$ export var=value
sh$ echo "$var"
value
sh$ sh -c 'echo "$var"' # see that it really is exported
value
Dalam dunia sekarang ini, apakah aman untuk mengatakan bahwa export var=value
itu aman untuk digunakan?
Saya ingin memahami apa konsekuensinya. Jika tidak portabel untuk v7 "Bourne classic", itu hampir tidak lebih dari hal sepele. Jika ada sistem produksi di mana shell benar-benar tidak dapat mengatasi sintaks ini, itu akan berguna untuk diketahui.
sumber
busybox
datang dengan cangkang minimal sendiri? (Saya tidak dalam posisi untuk mencoba saat ini juga.)Jawaban:
tidak didukung oleh shell Bourne (shell lama dari tahun 70an yang darinya
sh
implementasi modern seperti ash / bash / ksh / yash / zsh berasal). Itu diperkenalkan olehksh
.Di shell Bourne, Anda akan melakukan:
atau:
atau dengan
set -k
:Sekarang, perilaku:
bervariasi dari shell ke shell.
Masalahnya adalah bahwa penugasan dan argumen perintah sederhana diuraikan dan ditafsirkan secara berbeda.
Di
foo=bar
atas ditafsirkan oleh beberapa shell sebagai argumen perintah dan oleh orang lain sebagai tugas (kadang-kadang).Contohnya,
diartikan sebagai:
dengan beberapa shell (
ash
, versi lamazsh
(dalam emulasi sh),yash
) dan:yang lain (
bash
,ksh
).Sementara
atau
akan diinterpretasikan sama di semua shell (as
'export' 'd=b' 'c'
) karena backslash atau tanda dolar menghentikan shell yang mendukungnya untuk mempertimbangkan argumen tersebut sebagai tugas.Jika
export
itu sendiri dikutip atau hasil dari beberapa ekspansi (bahkan sebagian), tergantung pada shell, itu juga akan berhenti menerima perlakuan khusus.Lihat " Apakah kutipan diperlukan untuk penugasan variabel lokal? " Untuk detail lebih lanjut tentang itu.
Sintaks Bourne:
ditafsirkan sama oleh semua shell tanpa ambiguitas (
d=$a export d
juga akan bekerja di shell Bourne dan POSIX compliant tetapi tidak dalam versi terbaruzsh
kecuali dalamsh
emulasi).Itu bisa menjadi jauh lebih buruk dari itu. Lihat misalnya diskusi terkini tentang
bash
kapan array terlibat.(IMO, itu adalah kesalahan untuk memperkenalkan fitur itu ).
sumber
foo=bar export foo
, karena saya selalu melihatnya di sana. Saya tahu ekspor adalah standar, tetapi mengapafoo=bar; foo=baz export foo; echo $foo
berperilaku berbeda darifoo=bar; foo=baz /bin/cat /dev/null; echo $foo
?export
merupakan.declare
, tidakexport
, saya sarankan siapa pun yang peduli tentang keamanan membaca diskusi di tautan yang disediakan StéphaneChazelas kepada bash.bugs .d=$a export d
diartikan sama oleh semua kerang tanpa ambiguitas ;-)d=$a export d
tidak berfungsi lagizsh
, jadi saya sudah memperbarui jawabannya. Lihat edit.Ini bukan bashism tapi sintaks yang sesuai dengan POSIX. Ini sebenarnya dimulai sebagai kshism cukup lama dan kemudian diadopsi oleh hampir semua cangkang sintaksis Bourne. Satu-satunya pengecualian yang terkenal adalah
/bin/sh
pada Solaris 10 dan lebih lama yang melekat pada sintaksis Bourne shell lama. Semoga, Solaris 11 menggunakan shell yang sesuai dengan POSIX/bin/sh
.Ngomong-ngomong,
export
sudah ada perintah builtin di shell Bourne warisan sehingga googlingexport: command not found
adalah menyesatkan.Berikut adalah perilaku shell Bourne warisan ketika
export
dikombinasikan dengan sebuah kepura-puraan:Untuk nostalgia, kode sumber shell Bourne
asliini tersedia dan dapat dikompilasi untuk sebagian besar distribusi Unix dan Linux.sumber