Neden değişkenleri atadığınız aynı satırda dışa aktarmıyorsunuz?


44

Bir önceki komutun son argümanı nedir?

shellcheck, değişkenleri atadığınız aynı satırda dışa aktarmamanızı söyler.

Nedenini merak ediyordum?

Aynı tavsiye uygulamak mı alias, declare, export, local, readonly, ve typeset?




9
Söz konusu kabuk denetimi kuralı SC2155'tir. Shellcheck oldukça iyi dokümantasyon vardır wiki .
phunehehe

3
Ayrıca bazı eski kabukları exportbirlikte kabul ve atama olmaz . Heirloom Bourne Kabuk , örneğin, hata "2, bir tanımlayıcı değil = fon" bir çıktı olarak verir.
Dennis Williamson,

Yanıtlar:


54

Sorun Bash her komutu tek çıkış kodu olmasıdır. Ne zaman size export foo="$(false)"çıkış kodu falsebasitçe atılır. Eğer yerine

foo="$(false)"
export foo

başarısız olan ilk komut, örneğin errexitayar ile harekete geçirilebilir .

Bir dize değişmez olarak bildirmek ve atamak export foo='bar'elbette bu sorundan muzdarip değildir. Ancak değişim, yazılım geliştirmedeki tek değişmezdir ve bu tür ifadeleri bölüştürerek geleceğe dönük olarak korumada fayda vardır.

Söz ettiğiniz atamaya özel komutlara ek olarak, örneğin tek bir ödevde birden çok komut vardır foo="$(false)$(true)". Bkz pipefailiçinde man bashbir başka tür tuzak için.

Unutulmaması gereken bir başka şey, beyan ve görev dizisinin bazen ilgili olduğudur. Örneğin, değişkenleri atamadan önce bildirmek isteyeceksiniz . (Ne yazık ki, değişkenleri ilk defa atamadan önce bildirmek mümkün değildir .)local readonly


Eğer biri değişmezden bir değişken ayarlıyorsa ve atılacak çıkış kodu yoksa, hepsini tek bir satırda yapmanın yanlış bir tarafı yoktur.
Monty Harder

1
Bu kabuk kontrol hatası söz konusu olduğunda, hayır. Ancak şimdi silinen cevaplar aralarında yarı doğruya düştüğü için export, Bourne kabuğu atama sözdizimini desteklemedi , bu nedenle birkaç yıl boyunca, bir tercümanın Bourne kabuğu olması muhtemelse, bunu yapma konusunda bilgelik elde edildi.
JdeBP

@JdeBP, Bourne kabuğunun destek verdiğini foo=$(cmd) export fooancak aynı şekilde cmdçıkış durumunun kaybedildiğini de belirtmiştir (ancak başarısız olursa kabuğun çıkmasına neden olmuştur set -e).
Stéphane Chazelas

Bu benim ilk cümleme aitti.
JdeBP
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.