Saya mendapatkan yang ini ketika saya membuka sesi terminal:
sh: error mengimpor definisi fungsi untuk `read.json '
sh: error mengimpor definisi fungsi untuk `ts-project '
sh tidak menyukai fungsi-fungsi ini karena terlihat seperti:
read.json(){
::
}
dan
ts-project(){
::
}
pertanyaan sebenarnya adalah - mengapa sh
menyentuh / menafsirkan file-file ini? Saya menggunakan MacOS dan melihat ini sebelumnya, ini adalah misteri. Saya pikir hanya bash yang akan memuat file-file ini.
perbarui : bash dan sh tidak ada yang luar biasa. ketika saya mengetik bash ke terminal, saya mendapatkan ini:
alex$ bash
beginning to load .bashrc
finished loading .bashrc
bash-3.2$
ketika saya mengetik sh
di terminal, saya mendapatkan ini:
alex$ sh
sh: error importing function definition for `read.json'
sh: error importing function definition for `ts-project'
sh-3.2$
bash
shell
bash-functions
Alexander Mills
sumber
sumber
sh
apa sumber file .profile?bash
sumber yang sama , yang satu denganSTRICT_POSIX
, yang lain tanpa itu.Jawaban:
Kesalahan itu terjadi ketika
bash
menyamar sebagai shell POSIX mencoba mengimpor fungsi-fungsi dari lingkungan, bukan ketika memuatnya dengan menafsirkan file seperti~/.bashrc
atau itu. Contoh sederhana:Saya berharap
bash
untuk tidak memuat fungsi-fungsi dari lingkungan ketika dalam mode posix, tetapi ya , dan hanya mengeluh ketika nama mereka mengandung karakter lucu.Perhatikan bahwa
bash
juga akan berjalan dalam modus POSIX ketikaPOSIXLY_CORRECT
atauPOSIX_PEDANTIC
variabel lingkungan diatur, atau ketika dikompilasi dengan--enable-strict-posix-default
/STRICT_POSIX
.Yang terakhir ini tampaknya menjadi kasus untuk
/bin/sh
di MacOS (lihat di sini untukPRODUCT_NAME = sh
), di mana saya berharap kesalahan ini juga memicu ketika menggunakan fungsi perpustakaan sepertipopen(3)
atausystem(3)
.sumber
sh
adalah apa yang membuat kerentanan shellshock / bashdoor jauh lebih buruk.SHELLOPTS=posix
dan-o posix
untuk cara-cara lain untuk mengaktifkan mode posix.set -a
/set -o allexport
juga menyebabkan bash untuk mengekspor semua fungsi (dan jika dipanggil sebagaish
, menyebabkanPOSIXLY_CORRECT
disetel dan diekspor!)sh -a
menyebabkanPOSIXLY_CORRECT
diatur dan diekspor;set -a
setelahsh
tanpa-a
dimulai tidak mengeksporPOSIXLY_CORRECT
karena diatur sebelum-a
diberlakukan).Untuk menjawab bagian tentang mengapa
read.json
dants-project
bukan nama fungsi portabel:Menurut POSIX, definisi fungsi harus dinamai oleh
Juga dikenal sebagai pengidentifikasi , dalam bahasa C. Atau di regex:
[_a-zA-Z][0-9_a-zA-Z]*
sumber
zsh
/rc
/fish
...)bash
, atau itu tidak akan mengimpor fungsi dari lingkungan saat dalam mode POSIX, yang tidak diperlukan oleh spesifikasi POSIX ;-)Jadi apa yang menyebabkannya adalah saya mencari beberapa skrip bash di file ~ / .bashrc saya seperti ini:
jadi saya hanya mengubahnya menjadi:
jadi secara teori jika itu dipanggil
sh
maka tidak akan mencoba untuk sumber file-file itu, tetapi tidak yakin apakah ini berfungsi 100% dari waktu.sumber