Sh (bash değil) neden .bashrc dosyamda tanımlanan işlevlerden şikayet ediyor?


11

Terminal oturumu açtığımda bunu alıyorum:

sh: "read.json" için işlev tanımını içe aktarma hatası

sh: ts-project için işlev tanımını içe aktarma hatası

sh bu işlevleri sevmez çünkü şöyle görünürler:

read.json(){
   ::
}

ve

ts-project(){
   ::
}

asıl soru şu - shbu dosyalara neden dokunmak / yorumlamak? MacOS'tayım ve bunu daha önce görmüştüm, bu çok gizem. Ben sadece bash bu dosyaları yüklemek olacağını düşünüyorum.

güncelleme : bash ve sh sıradan dışında bir şey değildir. Terminal içine bash yazdığımda, bunu elde:

alex$ bash
beginning to load .bashrc
finished loading .bashrc
bash-3.2$ 

Ben yazarken shterminalde, bu alın:

alex$ sh
sh: error importing function definition for `read.json'
sh: error importing function definition for `ts-project'
sh-3.2$ 

1
Belki / bin / sh olduğunu o sistem üzerinde bash?
Jeff Schaller

1
hiçbiri birbirine kaynak vermedi, bunun zor bir yol olduğunu gördüm. Ancak, ~ / .profile paylaşılan bir bash dosyası kaynak, bu yüzden sh.profile dosya kaynakları ne?
Alexander Mills

1
Paylaşılan dosyayı kaynaklayan bir ~ / .profile dosyasına sahip olmayla ilgili bilgiler benim için önemli görünüyor.
Jeff Schaller

3
Demek istediğim / bin / sh bash olmak, syminkink veya bash için hardlink bağlı olmasıdır. Bash daha sonra sh'yi öykünür, fakat aynı zamanda ~ / .profile kaynağı oluşturur. OSX paketlerinin nasıl sh ve bash olduğunu bilmiyorum.
Jeff Schaller

3
Aynı bashkaynaktan, biri ile STRICT_POSIX, diğeri olmadan inşa edilirler .
mosvy

Yanıtlar:


20

Bu hata bash, POSIX kabuğu olarak maskelenirken, bu işlevleri benzer bir dosyayı yorumlayarak yüklerken değil, ortamdan içe aktarmaya çalışırken oluşur ~/.bashrc. Basitleştirilmiş örnek:

foo.bar(){ true; }; export -f foo.bar; bash --posix -c true
bash: error importing function definition for `foo.bar'

Beklediğim bashzaman POSIX kipinde çevreden fonksiyonlarını görüntülemek için değil, ama öyle ve isimleri komik karakterler içeren yalnızca şikayet ediyor.

Veya ortam değişkeni ayarlandığında veya / ile derlendiğinde bashposix modunda da çalışacağına dikkat edin .POSIXLY_CORRECTPOSIX_PEDANTIC--enable-strict-posix-defaultSTRICT_POSIX

Bu ikincisi /bin/sh, MacOS (veya buraya bakın PRODUCT_NAME = sh) için olduğu gibi, bu hatanın popen(3)veya gibi kütüphane işlevlerini kullanırken de tetiklenmesini bekliyorum system(3).


3
Çözüm: Ortamdaki işlevleri dışa aktarmayın. Shellshock'a yol açan (veya daha doğrusu) bash anti-özelliği budur ve kaldırılmalıydı, ancak insanların aptalca kullanması değildi. Onlardan biri olma.
R .. GitHub BUZA YARDIMCI DURDUR

Bash ithalatı fonksiyonlar olarak adlandırılan bile gerçeği shbir shellshock / bashdoor açığını yapılan budur çok daha kötü.
Stéphane Chazelas

Ayrıca SHELLOPTS=posixve -o posixposix modunu etkinleştirmenin diğer yolları için bkz .
Stéphane Chazelas

Ayrıca unutmayınız set -a/ set -o allexportda tüm fonksiyonları ihracat Bash neden olur (ve olarak çağrıldığında sh, nedenleri POSIXLY_CORRECTkurmak ve ihraç edilecek!)
Stéphane Chazelas

( sh -aNedenleri POSIXLY_CORRECTkurmak ve ihraç edilecek; set -asonra sholmadan -aithal etmeyen başladı POSIXLY_CORRECTdaha önce kuruldu çünkü -ayürürlükte olan).
Stéphane Chazelas

5

Taşınabilir işlev adlarının neden read.jsonve neden ts-projectolmadığı kısmına cevap vermek için :

POSIX'e göre, bir işlev tanımı şu şekilde adlandırılmalıdır :

taşınabilir karakter kümesinden yalnızca alt çizgi, rakam ve alfabetik sözcüklerden oluşan bir sözcük. Bir adın ilk karakteri bir rakam değildir.

C lingo'da tanımlayıcı olarak da bilinir . Veya normal ifade ile:[_a-zA-Z][0-9_a-zA-Z]*


Bash Ama o değil POSIX, fonksiyonlar için diğer adlar kabul etmesini uygulamaları yasaklamak değil sahip olduğunda POSIX modunda bu kısıtlamalar empoze etmek. işlev adları komut bağımsız değişkenleriyle aynı ad alanını paylaşır, bu nedenle yalnızca / / ... gibi bir şey kabul etmek için hiçbir neden yokturzshrcfish
Stéphane Chazelas

@ StéphaneChazelas: Biliyorum, ama "tüm uzantıları atma" değilse, "onları sessizce kabul etme" durumunda olduğu gibi POSIX modunda olmak ne anlama geliyor?
user2394284

@ user2394284 kesinlikle gelmez ki bash, ya da olur ortamdan değil ithalat fonksiyonları POSIX Spec ;-) tarafından gerekli değildir POSIX modunda iken
mosvy

@mosvy: Evet, bash'ın yol boyunca bir yerde başarısız olduğu açıktır - düz bir POSIX kabuğu olarak söyleyebilirim, bu bir hata olurdu.
user2394284

0

Peki neden böyle benim ~ / .bashrc dosyasında bazı bash komut dosyaları kaynak duyuyorum oldu:

for f in "$HOME/.oresoftware/bash/"*; do
   . "$f"
done;

bu yüzden sadece şu şekilde değiştirdim:

for f in "$HOME/.oresoftware/bash/"*; do
  if [[ "$(basename "$0")" != 'sh' ]]; then
      # source only if not using sh
      . "$f"
  fi
done;

Teoride, eğer çağrılırsa, shbu dosyaları kaynaklamaya çalışmaz, ancak bunun% 100'ünün çalışıp çalışmadığından emin değildir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.