Jika saya menjalankan file .sh berikut:
#!/bin/sh -a
echo "a" | sed -e 's/[\d001-\d008]//g'
Hasilnya adalah kesalahan:
sed: -e express # 1, char 18: End range tidak valid
Tetapi jika saya menjalankan file .sh berikut:
#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'
Ini berjalan tanpa kesalahan. Bukankah kode kedua seharusnya sama dengan yang pertama? Mengapa kesalahan yang pertama?
shell-script
shell
sed
options
Rodrigo
sumber
sumber
sh
sama. Tidak semua sed setara. Yangsh
kamu gunakan Di OS mana? dan yang sed (mungkin?sed --version
jika tidak gagal)?LC_COLLATE=C
(atauPOSIX
) untuk panggilan untuksed
mengatasi masalahPOSIXLY_CORRECT=y
di lingkungan, yang kedua tidak adaPOSIXLY_CORRECT
di lingkungan. Shell saya memanggil kedua skrip dari tidak adaPOSIXLY_CORRECT
di lingkungannya.echo "a" | POSIXLY_CORRECT=y sed -e 's/[\d001-\d008]//g'
mereproduksi masalah AndaJawaban:
Ketika bash dipanggil dengan namanya
sh
, ia melakukan ini :dan kemudian mengatur
POSIXLY_CORRECT
variabel shell key
:bind_variable
panggilanbind_variable_internal
, yang, jika atribut shella
aktif pada saat itu (yang akan terjadi jika Anda memanggil shell dengan-a
), menandai variabel shell sebagai diekspor .Jadi dalam skrip pertama Anda:
sed
dipanggil denganPOSIXLY_CORRECT=y
di lingkungannya, yang akan membuatnya mengeluh[\d001-\d008]
. (Hal yang sama terjadi jika sed diberikan--posix
opsi.)Di GNU sed, adalah kode melarikan diri untuk karakter yang nilai numerik dalam basis-10 adalah NNN , tapi dalam modus POSIX, ini dinonaktifkan dalam ekspresi braket, sehingga , berarti harfiah karakter , dll, dengan kisaran yang dari untuk . Dalam urutan kode karakter, muncul sebelum (dan rentang mencakup semua digit kecuali nol, ditambah semua huruf besar, ditambah beberapa karakter khusus). Di lokal yang Anda gunakan, ketik sebelumnya , sehingga rentang tidak valid.
\dNNN
[\d001-\d008]
\
d
1
\
1
\
en_US.UTF-8
\
1
Dalam skrip kedua Anda:
meskipun
POSIXLY_CORRECT
diatur dalam shell, itu tidak diekspor, jadi sed dipanggil tanpaPOSIXLY_CORRECT
di lingkungan, dan sed berjalan dengan ekstensi GNU.Jika Anda menambahkan di
export POSIXLY_CORRECT
dekat bagian atas skrip kedua, Anda juga akan melihat keluhan.sumber
/bin/sh
sebenarnya berasal dari menjadi Bash). Hal yang sama terjadi jikaPOSIXLY_CORRECT
ada di lingkungan sebelumsh
Bash dimulai: ia juga akan meneruskannya sebagaiPOSIXLY_CORRECT=y
.POSIXLY_CORRECT
tidak di lingkungan ketika shell dimulai, dan skrip tidak mengaturnya. Shell tidak. Itu menciptakan variabel lingkungan entah dari mana, yang lebih buruk karena melakukan itu dalam mode di mana seharusnya, dan mencoba untuk menjadi standar-compliant.POSIXLY_CORRECT
sendiri. Tidak disebutkan dalam daftar efek mode POSIX dan deskripsi variabel hanya mengatakan bahwa pengaturan itu mengubah shell ke mode POSIX, bukan sebaliknya.allexport
.