Bash içinde set -k seçeneğinin pratik kullanımı


16

set -kBash'de seçeneği ne zaman kullanıyoruz ?

Bash referans el kitabı diyor ki,

Atama deyimleri biçimindeki tüm bağımsız değişkenler, yalnızca komut adından önce gelenler için değil, bir komut için ortama yerleştirilir.

Seçeneğin ne yaptığını anlıyorum ama ihtiyacımız olduğunda hayal bile edemiyorum.


Doğru algı. -kBizim onları gözden geçirmeniz gerek kalmadan 30 yaşındaki kabuk komut dosyalarını çalıştırmak için izin verir. Bunun yerine önek sözdizimini kullanarak geçici ortam değişkenlerini var1=x var2=y command ...
iletin

Yanıtlar:


14

Temel olarak, bir kabuk betiğine geçirilen ortam değişkenlerini (bağımsız değişkenler olarak) ortam içinden ayarlanmışlar gibi export, ancak exportkomutları çalıştırmadan önce kalıcı olarak listelerinde kalmasına gerek kalmadan "enjekte etmek" istediğinizde kullanabilirsiniz. .

NOT:-k Anahtarın uzun biçimi de vardır set -o keyword.

Misal

$ cat cmd1.bash 
#!/bin/bash

echo $VARCMD

Şimdi eğer ben set -k:

$ set -k; ./cmd1.bash VARCMD="hi"; set +k
hi

Ama eğer yukarıdaki betiği çalıştırırsam:

$ ./cmd1.bash 

$

İhracat ne yapıyor?

$ help export
...
Marks each NAME for automatic export to the environment of subsequently
executed commands.  If VALUE is supplied, assign VALUE before exporting.
...

Eğer betiğimize şöyle eklersek export | grep VAR:

$ cat cmd2.bash 
#!/bin/bash

echo $VARCMD
export | grep VAR

Ve yukarıdaki testlerimizi tekrar yaptık:

$ set -k; ./cmd2.bash VARCMD="hi"; set +k
hi
declare -x VARCMD="hi"

Ancak set -k:

$ ./cmd2.bash 

$

Yani set -kgeçici olarak toplu olarak değişkenleri dışa aktarmamıza izin veriyor.

Başka bir örnek

$ cat cmd3.bash 
#!/bin/bash

echo $VARCMD1
echo $VARCMD2
export | grep VAR

Birden çok değişken belirlediğimizde, bunların tümü dışa aktarılır:

$ set -k; ./cmd3.bash VARCMD1="hi" VARCMD2="bye"; set +k
hi
bye
declare -x VARCMD1="hi"
declare -x VARCMD2="bye"

O zaman sadece tüm çevre değişkenlerini mi enjekte ediyor?

Hayır -kburada çok açık bir şey yapmıyor. Yalnızca bir komut yürütüldüğünde komut satırında yer alan değişkenleri dışa aktarır.

Misal

Diyelim ki bu değişkeni ayarladım:

$ VARCMD1="hi"

Şimdi aynı komutu atladığımızda VARCMD1="hi":

$  set -k; ./cmd3.bash VARCMD2="bye"; set +k

bye
declare -x VARCMD2="bye"

Ama bu neden var?

"Anahtar Kelime Parametre Atama Dizeleri" başlıklı bu özellik hakkında biraz açıklama yapan bu kaynağı buldum. NOT: Kaynak URL bir IP adresi kullanır, bu yüzden doğrudan burada SE'ye bağlanamam.

http://140.120.7.21/OpenSystem2/SoftwareTools/node16.html

Herhangi bir dilde programlama yaparken, değişken ve değer geçirme güvenilir kod yazmak için çok önemlidir. Tamsayı ve dizi değişkeni türlerinin yanı sıra, diğer tüm kabuk değişkenleri dizeleri değerleri olarak kabul eder. Kabuk programlama dilinden bahsederken tutarlı olmak için "anahtar kelime parametresi" ifadesini tercih ediyoruz. Anahtar kelime parametrelerine değer atarken dikkat etmeniz gereken birkaç nokta:

  • Beklenmeyen bir etkiyi önlemek için, parametre atama alt dizesini her zaman bir komut dizesinin önüne yerleştirin.

    B kabuğunda, anahtar kelime parametrelerinin atanan değerleri (yerel) kabuk değişkenlerinde saklanır. Bash ve ksh öğelerinde, komuttan önceki anahtar kelime parametre atama dizeleri kabuk değişkenlerinde saklanmaz. Yalnızca geçerli komutu yürütmek için çatallanan anlık alt işlemi etkiler. Tek başına anahtar kelime parametresi atama dizeleri, (yerel) kabuk değişkenlerinde depolanır. Anahtar kelime parametresi atama dizeleri, takma ad, bildirim, dizgi, dışa aktarma, salt okunur ve yerel yerleşik komutlara bağımsız değişken olarak da görünebilir. [Bash Referans El Kitabı Bölüm 3.4]

  • Anahtar kelime parametresi atama dizeleri, komut adından sonra yerleştirilirse yürütülecek komutun bağımsız değişkenleri olarak ele alınır.

  • Anahtar kelime parametreleri set komutu ile değiştirilebilir.

Bu bağlantıda, seçenek yanında verdikleri için ss64.com/bash/set.html . Bu bir şey ifade ediyor mu? set -k-o keyword-k
Ramesh

@Ramesh - set -o keyworduzun biçimidir set -k. Bkz help set | grep -- '-k'.
slm

Ah tamam. Neden 2 seçeneğin olduğunu anlamaya çalışarak uzun süre başımı kaşıyordum. Her zamanki gibi mükemmel cevap :)
Ramesh

4
./cmd.bash VARCMD=hiolmadan set -ktam olarak olduğu gibi çalışması gerekiyor . OP'nin özel sorusunun, formun desteklenmesi için bash ihtiyacı etrafında olduğunu tahmin edinVARCMD=hi ./cmd.bashset -k./cmd.bash VARCMD=hi
iruvar

@ 1_CR - iyi bir nokta. Her şeyden çok stil ile ilgili olduğuna inanıyorum, ama gerçek bir kaynak bulabileceğimi göreceğim.
slm

8

Herhangi bir pratik kullanımı set -kmuhtemelen sadece kişisel stil. Bazıları - belki de işlev çağrılarında anahtar kelime bağımsız değişkenlerini kullanma yeteneği sunan programlama dillerini sevenler ya da ddkomutun sözdizimini beğenen az sayıda kişi -

set -k
...
komut var 1 = val 1 var 2 = val 2

için

var 1 = val 1 var 2 = val 2 komutu

Seçeneğin bazı kabuklarda var olmasının gerçek nedeni , POSIX standardındaki set komutu için mantıkta açıklanmıştır :

The following set flags were omitted intentionally with the following rationale:

The -k flag was originally added by the author of the Bourne shell to make it easier
for users of pre-release versions of the shell. In early versions of the Bourne shell
the construct
    set name=value
had to be used to assign values to shell variables.
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.