Praktyczne użycie opcji `set -k` w bash


16

Kiedy używamy set -kopcji w bash?

Podręcznik referencyjny Bash mówi:

Wszystkie argumenty w postaci instrukcji przypisania są umieszczane w środowisku dla polecenia, nie tylko te poprzedzające nazwę polecenia.

Rozumiem, co robi ta opcja, ale nie mogłem sobie wyobrazić, kiedy jej potrzebujemy.


Prawidłowa percepcja. -kPozwala nam uruchomić 30-letni skrypty powłoki bez konieczności ich byłaby. Zamiast tego var1=x var2=y command ...
przekazuj

Odpowiedzi:


14

Zasadniczo możesz go użyć w dowolnym momencie, kiedy chcesz „wstrzyknąć” zmienne środowiskowe przekazane do skryptu powłoki (jako argumenty) tak, jakby były ustawione w środowisku przez export, ale bez konieczności stałego umieszczania ich na exportliście przed uruchomieniem poleceń .

UWAGA: Istnieje również długa forma -kprzełącznika set -o keyword.

Przykład

$ cat cmd1.bash 
#!/bin/bash

echo $VARCMD

Teraz jeśli set -k:

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

Ale gdybym tylko uruchomił powyższy skrypt:

$ ./cmd1.bash 

$

Co robi eksport?

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

Więc jeśli mielibyśmy dodać export | grep VARdo naszego skryptu w ten sposób:

$ cat cmd2.bash 
#!/bin/bash

echo $VARCMD
export | grep VAR

I ponownie przeprowadziliśmy powyższe testy:

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

Ale bez set -k:

$ ./cmd2.bash 

$

Więc set -kpozwala nam tymczasowo wyeksportować zmienne w masie.

Inny przykład

$ cat cmd3.bash 
#!/bin/bash

echo $VARCMD1
echo $VARCMD2
export | grep VAR

Kiedy ustawiamy wiele zmiennych, wszystkie są eksportowane:

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

Więc to tylko wstrzyknięcie wszystkich zmiennych środowiskowych?

Nie -k robi tutaj bardzo wyraźnej rzeczy. To tylko eksportowanie zmiennych, które były zawarte w wierszu poleceń, gdy polecenie zostało wykonane.

Przykład

Powiedzmy, że ustawiłem tę zmienną:

$ VARCMD1="hi"

Teraz, gdy uruchomimy to samo polecenie, pomijając VARCMD1="hi":

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

bye
declare -x VARCMD2="bye"

Ale dlaczego to istnieje?

Znalazłem to źródło, które trochę wyjaśnia tę funkcję, zatytułowane: „Ciągi parametrów przypisania parametru słowa kluczowego”. UWAGA: źródłowy adres URL używa adresu IP, więc nie mogę połączyć się z nim bezpośrednio tutaj w SE.

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

Podczas programowania w dowolnym języku zmienna i jej przekazywanie wartości mają kluczowe znaczenie dla pisania niezawodnego kodu. Oprócz typów zmiennych całkowitoliczbowych i tablicowych wszystkie pozostałe zmienne powłoki przyjmują ciągi znaków jako swoje wartości. Mówiąc o języku programowania powłoki, aby zachować spójność, wolimy wyrażenie „parametr keyword”. Oto kilka punktów, na które należy zwrócić uwagę przy przypisywaniu wartości do parametrów słów kluczowych:

  • Aby uniknąć nieoczekiwanego efektu, zawsze umieszczaj podłańcuch przypisania parametru przed ciągiem poleceń.

    W powłoce B przypisane wartości parametrów słów kluczowych zostaną zapisane w (lokalnych) zmiennych powłoki. W bash i ksh łańcuchy parametrów parametru słowa kluczowego poprzedzające polecenie nie będą przechowywane w zmiennych powłoki. Wpływają tylko na natychmiastowy rozwidlenie podprocesu w celu wykonania bieżącego polecenia. Sam wiersz ciągów przypisywania parametrów słów kluczowych jest przechowywany w (lokalnych) zmiennych powłoki. Ciągi przypisania parametrów słowa kluczowego mogą również pojawiać się jako argumenty w aliasach, deklarowaniu, składaniu, eksportowaniu, tylko do odczytu i wbudowanych poleceniach lokalnych. [Sekcja 3.4 podręcznika Bash Reference]

  • Ciągi przypisania parametrów słowa kluczowego będą traktowane jako argumenty do wykonania polecenia, jeśli są umieszczone po nazwie polecenia.

  • Parametrami słów kluczowych można manipulować za pomocą polecenia set.

W tym linku ss64.com/bash/set.html , set -kponieważ podali -o keywordoprócz -kopcji. Czy to coś znaczy?
Ramesh

@Ramesh - set -o keywordjest długą formą set -k. Zobaczyć help set | grep -- '-k'.
slm

ah ok. Drapałem się po głowie przez długi czas, próbując zrozumieć, dlaczego są 2 opcje. Jak zwykle idealna odpowiedź :)
Ramesh

4
./cmd.bash VARCMD=himusi set -ksprawić, aby działał dokładnie tak, jak VARCMD=hi ./cmd.bashrobi to bez set -k. Zgadnij, konkretne pytanie OP dotyczy potrzeby bash do obsługi ./cmd.bash VARCMD=hiformularza
iruvar

@ 1_CR - dobry punkt. Wierzę, że ma to związek ze stylem bardziej niż cokolwiek innego, ale zobaczę, czy mogę znaleźć prawdziwe źródło.
slm

8

Każde praktyczne użycie set -kjest prawdopodobnie tylko osobistym stylem. Niektórzy - być może ci, którzy lubią języki programowania, które oferują możliwość używania argumentów słów kluczowych w wywołaniach funkcji, lub ci nieliczni, którzy lubią ddskładnię polecenia - mogą preferować

ustaw -k
...
polecenie var 1 = val 1 var 2 = val 2

do

komenda
 var 1 = val 1 var 2 = val 2

Rzeczywisty powód, dla którego opcja istnieje w niektórych powłokach, wyjaśniono w uzasadnieniu polecenia set w standardzie POSIX :

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.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.