🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.os.linux
13 messages
13 total messages Started by szopen Mon, 21 Oct 2024 15:09
ssh, mkdir i zmienne w skrypcie
#907839
Author: szopen
Date: Mon, 21 Oct 2024 15:09
17 lines
1546 bytes
Ze 3h już się z tym kopię i wymiękam, może ktoś poradzi?

Mam skrypt, w nim zmienną i chcę na zdalnym hoście utworzyć katalog o nazwie wskazanej przez zmienną. Problem w tym, że 
zmienna zawiera tyldę i się rozwija lokalnie lub nie rozwija i tworzy katalog literalnie ~ w katalogu domowym serwera:

[...]
BACKUP_DIR="~/backups"

ssh -i "$SSH_KEY_FILE" "$HOST_USER@$HOST_ADDRESS" \
                        "HOST_ADDRESS='$HOST_ADDRESS' \
                         HOST_DB_BACKUPS_PATH='$BACKUP_DIR' \
                         mkdir -p $HOST_DB_BACKUPS_PATH"

To jest punkt wyjścia, nie działa. Jak to zrobić poprawnie?

-- 
szopen
Re: ssh, mkdir i zmienne w skrypcie
#907840
Author: marrgol
Date: Mon, 21 Oct 2024 23:07
20 lines
1917 bytes
On 2024-10-21 at 17:09 szopen wrote:
> Mam skrypt, w nim zmienną i chcę na zdalnym hoście utworzyć katalog o nazwie
> wskazanej przez zmienną. Problem w tym, że zmienna zawiera tyldę i się
> rozwija lokalnie lub nie rozwija i tworzy katalog literalnie ~ w katalogu
> domowym serwera:
> 
> [...]
> BACKUP_DIR="~/backups"
> 
> ssh -i "$SSH_KEY_FILE" "$HOST_USER@$HOST_ADDRESS" \
>                        "HOST_ADDRESS='$HOST_ADDRESS' \
>                         HOST_DB_BACKUPS_PATH='$BACKUP_DIR' \
>                         mkdir -p $HOST_DB_BACKUPS_PATH"
> 
> To jest punkt wyjścia, nie działa. Jak to zrobić poprawnie?

ssh -i "$SSH_KEY_FILE" "$HOST_USER@$HOST_ADDRESS" \
                       "HOST_ADDRESS=$HOST_ADDRESS \
                        HOST_DB_BACKUPS_PATH=$BACKUP_DIR
                        mkdir -p \$HOST_DB_BACKUPS_PATH"
Re: ssh, mkdir i zmienne w skrypcie
#907841
Author: validator
Date: Tue, 22 Oct 2024 06:30
26 lines
2111 bytes
Dnia 21.10.24 | 23:07 marrgol <marrgol@address.invalid> napisał/a:
> On 2024-10-21 at 17:09 szopen wrote:
>> Mam skrypt, w nim zmienną i chcę na zdalnym hoście utworzyć katalog o nazwie
>> wskazanej przez zmienną. Problem w tym, że zmienna zawiera tyldę i się
>> rozwija lokalnie lub nie rozwija i tworzy katalog literalnie ~ w katalogu
>> domowym serwera:
>> 
>> [...]
>> BACKUP_DIR="~/backups"
>> 
>> ssh -i "$SSH_KEY_FILE" "$HOST_USER@$HOST_ADDRESS" \
>>                        "HOST_ADDRESS='$HOST_ADDRESS' \
>>                         HOST_DB_BACKUPS_PATH='$BACKUP_DIR' \
>>                         mkdir -p $HOST_DB_BACKUPS_PATH"
>> 
>> To jest punkt wyjścia, nie działa. Jak to zrobić poprawnie?
>
> ssh -i "$SSH_KEY_FILE" "$HOST_USER@$HOST_ADDRESS" \
>                        "HOST_ADDRESS=$HOST_ADDRESS \
>                         HOST_DB_BACKUPS_PATH=$BACKUP_DIR
>                         mkdir -p \$HOST_DB_BACKUPS_PATH"
>

+ moje 2 grosze:
na zdalnym hoście tylda rozwija się poprawnie tylko wtedy,
gdy jest bezpośrednio w poleceniu, a nie w zmiennej
Re: ssh, mkdir i zmienne w skrypcie
#907842
Author: marrgol
Date: Tue, 22 Oct 2024 11:02
10 lines
1611 bytes
On 2024-10-22 at 08:30 validator wrote:
> na zdalnym hoście tylda rozwija się poprawnie tylko wtedy,
> gdy jest bezpośrednio w poleceniu, a nie w zmiennej

Nie mąć ;), tylda zawsze¹ rozwija się poprawnie tylko gdy jest
bezpośrednio w poleceniu, a nie w zmiennej -- „zdalność” hosta
nie ma tu żadnego znaczenia, każde polecenie jest lokalne
dla hosta, na którym jest wykonywane.

¹ Z wyjątkiem użycia polecenia 'eval'.
Re: ssh, mkdir i zmienne w skrypcie
#907843
Author: Arnold Ziffel
Date: Wed, 23 Oct 2024 13:53
13 lines
1677 bytes
marrgol <marrgol@address.invalid> wrote:

> Nie mąć ;), tylda zawsze? rozwija się poprawnie tylko gdy jest
> bezpośrednio w poleceniu, a nie w zmiennej

A w zmiennej można użyć $HOME...

-- 
Myśliwy poszedł na polowanie i zobaczył zająca. Podszedł na 50 metrów,
przymierzył, strzelił. Dym się rozwiał, zając dalej siedzi. Podszedł na
20 metrów - to samo. Zdenerwował się, przyłożył zającowi lufę do głowy,
strzelił... Dym się rozwiał, zając wstaje, otrzepuje się i mówi:
- Pojebało Cię??!!
Re: ssh, mkdir i zmienne w skrypcie
#907844
Author: marrgol
Date: Wed, 23 Oct 2024 22:51
22 lines
1875 bytes
On 2024-10-23 at 15:53 Arnold Ziffel wrote:
>> Nie mąć ;), tylda zawsze? rozwija się poprawnie tylko gdy jest
>> bezpośrednio w poleceniu, a nie w zmiennej
> 
> A w zmiennej można użyć $HOME...

Można użyć $HOME zamiast tyldy, ale to niczego nie zmienia, bo wartość
zmiennej też jest podstawiana tylko gdy ta zmienna występuje bezpośrednio
w poleceniu, a nie w innej zmiennej:

$ echo ~/foo i $HOME/foo
/home/user/foo i /home/user/foo
$ ZM1='~/foo' ZM2='$HOME/foo'
$ echo $ZM1 i $ZM2
~/foo i $HOME/foo
$

Tu też wyjątkiem jest użycie polecenia 'eval':

$ eval echo $ZM1 i $ZM2
/home/user/foo i /home/user/foo
$
Re: ssh, mkdir i zmienne w skrypcie
#907845
Author: Marcin Debowski
Date: Thu, 24 Oct 2024 00:30
18 lines
1786 bytes
On 2024-10-23, marrgol <marrgol@address.invalid> wrote:
> $ eval echo $ZM1 i $ZM2
> /home/user/foo i /home/user/foo

Przy okazji niezwiązane pytanie...

agatek@surfacego:~$ ZM1=~/foo echo $ZM1

Dlaczego w powyższym powłoka ignoruje przypisanie nowej wartości ZM1 a 
jednoczesnie wykonuje polecenie po spacji? Jak dam średnik czy && po foo 
to zmienia wartość jak sie mozna spodziewac, a bez tego nie. Jakoś to mi 
dziwnie wygląda, bo jakby miał to być błąd to cos powinno ponarzekac, a 
skoro klarownie rozpoznaje, że jest to przypisanie wartości do zmiennej 
i potrafi ten segment oddzielic od polecania to dlaczego nie przypisuje 
wartości?

-- 
Marcin
Re: ssh, mkdir i zmienne w skrypcie
#907846
Author: marrgol
Date: Thu, 24 Oct 2024 10:56
32 lines
2573 bytes
On 2024-10-24 at 02:30 Marcin Debowski wrote:
> Przy okazji niezwiązane pytanie...
> 
> agatek@surfacego:~$ ZM1=~/foo echo $ZM1
> 
> Dlaczego w powyższym powłoka ignoruje przypisanie nowej wartości ZM1 a 
> jednoczesnie wykonuje polecenie po spacji? Jak dam średnik czy && po foo 
> to zmienia wartość jak sie mozna spodziewac, a bez tego nie.

Nie ignoruje, ta forma polecenia powoduje, że nowa wartość ZM1 będzie
dostępna tylko w środowisku polecenia po spacji, a nie w bieżącym:

$ ZM1=STARA
$ ZM1=~/foo echo $ZM1
STARA
$ ZM1=~/foo bash -c 'echo $ZM1'
/home/user/foo
$ ZM1=~/foo eval echo \$ZM1
/home/user/foo
$ echo $ZM1
STARA
$

W poleceniu 'ZM1=~/foo echo $ZM1' za $ZM1 shell podstawia znaną sobie starą
wartość ZM1 z bieżącego środowiska (albo pustą, jeśli ZM1 nie istnieje)
_zanim_ wykona całe polecenie.  Natomiast samodzielne przypisanie zmiennej
(w osobnej linii, oddzielone średnikiem, & itp. od innych poleceń) powoduje,
że nowa wartość ZM1 zostanie przypisana w bieżącym środowisku shella,
więc w następnych poleceniach interpreter podstawi tę nową wartość.

Jak chcesz zobaczyć co bash podstawia za zmienne, to po wpisaniu polecenia
zamiast je wykonywać wciśnij [Esc] [Ctrl-E] (albo [LeftAlt-Ctrl-E]).
Re: ssh, mkdir i zmienne w skrypcie
#907847
Author: szopen
Date: Thu, 24 Oct 2024 12:26
12 lines
1525 bytes
On 24.10.2024 12:56, marrgol wrote:

 > $ ZM1=~/foo eval echo \$ZM1
 > /home/user/foo
 > $ echo $ZM1
 > STARA

Możesz ten fragment wyjaśnić?
Co robi backslash oraz dlaczego na końcu jest STARA skoro chwilę prędzej podstawiłeś foo?

-- 
szopen
Re: ssh, mkdir i zmienne w skrypcie
#907848
Author: marrgol
Date: Thu, 24 Oct 2024 19:32
30 lines
2523 bytes
On 2024-10-24 at 14:26 szopen wrote:
>> $ ZM1=~/foo eval echo \$ZM1
>> /home/user/foo
>> $ echo $ZM1
>> STARA
> 
> Możesz ten fragment wyjaśnić?
> Co robi backslash 

Backslash pozbawia znak $ specjalnego znaczenia, czyli informuje
bieżącego shella żeby potraktował $ZM1 jako zwykły ciąg znaków
i pozostawił go w niezmienionej formie zamiast podstawiać w jego
miejsce wartość zmiennej ZM1.

Bez backslasha shell uruchomiłby polecenie w rozwiniętej postaci
'ZM1=/home/user/foo eval echo STARA', czyli eval dostałby argumenty
'echo STARA' i dokładnie takie polecenie zwróciłby shellowi do wykonania.

Z backslashem shell uruchomi polecenie w rozwiniętej postaci
'ZM1=/home/user/foo eval echo $ZM1', eval dostanie argumenty 'echo $ZM1',
więc „widzi”, że ma do podstawienia zmienną ZM1, a ponieważ w jego
środowisku ZM1 ma nową wartość, to zwraca shellowi do wykonania
polecenie 'echo /home/user/foo'.

> oraz dlaczego na końcu jest STARA skoro chwilę prędzej
> podstawiłeś foo?

Dla pokazania, że podstawiłem tylko dla komendy 'eval' -- przeczytaj
dokładnie o co pytał Marcin i moją odpowiedź, bo pytasz praktycznie
o to samo.
Re: ssh, mkdir i zmienne w skrypcie
#907849
Author: szopen
Date: Fri, 25 Oct 2024 16:52
17 lines
1948 bytes
On 24.10.2024 21:32, marrgol wrote:
>> oraz dlaczego na końcu jest STARA skoro chwilę prędzej
>> podstawiłeś foo?
> 
> Dla pokazania, że podstawiłem tylko dla komendy 'eval' -- przeczytaj
> dokładnie o co pytał Marcin i moją odpowiedź, bo pytasz praktycznie
> o to samo.

Tak, ale napisałeś to niezbyt klarownie lub też zbyt powierzchownie: "nowa wartość ZM1 będzie
dostępna tylko w środowisku polecenia po spacji".

Teraz już kumam, ale kilka ćwiczeń musiałem wykonać. Jest to z jednej strony zakręcone, bo trzeba myśleć wielowarstwowo, 
z drugiej jednak bardzo logiczne.
Dzięki.

-- 
szopen
Re: ssh, mkdir i zmienne w skrypcie
#907850
Author: Marcin Debowski
Date: Fri, 25 Oct 2024 23:18
46 lines
2938 bytes
On 2024-10-24, marrgol <marrgol@address.invalid> wrote:
> On 2024-10-24 at 02:30 Marcin Debowski wrote:
>> Przy okazji niezwiązane pytanie...
>> 
>> agatek@surfacego:~$ ZM1=~/foo echo $ZM1
>> 
>> Dlaczego w powyższym powłoka ignoruje przypisanie nowej wartości ZM1 a 
>> jednoczesnie wykonuje polecenie po spacji? Jak dam średnik czy && po foo 
>> to zmienia wartość jak sie mozna spodziewac, a bez tego nie.
>
> Nie ignoruje, ta forma polecenia powoduje, że nowa wartość ZM1 będzie
> dostępna tylko w środowisku polecenia po spacji, a nie w bieżącym:
>
> $ ZM1=STARA
> $ ZM1=~/foo echo $ZM1
> STARA
> $ ZM1=~/foo bash -c 'echo $ZM1'
> /home/user/foo

> $ ZM1=~/foo eval echo \$ZM1
> /home/user/foo
> $ echo $ZM1
> STARA

> W poleceniu 'ZM1=~/foo echo $ZM1' za $ZM1 shell podstawia znaną sobie starą
> wartość ZM1 z bieżącego środowiska (albo pustą, jeśli ZM1 nie istnieje)
> _zanim_ wykona całe polecenie.  Natomiast samodzielne przypisanie zmiennej

Ok, chyba coś zaczyna do mnie docierać... 
A we fragmencie bash -c 'echo $ZM1' 

...nie podstawia bo traktuje jako 'string'. Ale nowa powłoka z 
właściwości opcji -c traktuje ten sam string jako dalsze argumenty (nie 
wywala command not found). Tak?

> (w osobnej linii, oddzielone średnikiem, & itp. od innych poleceń) powoduje,
> że nowa wartość ZM1 zostanie przypisana w bieżącym środowisku shella,
> więc w następnych poleceniach interpreter podstawi tę nową wartość.
>
> Jak chcesz zobaczyć co bash podstawia za zmienne, to po wpisaniu polecenia
> zamiast je wykonywać wciśnij [Esc] [Ctrl-E] (albo [LeftAlt-Ctrl-E]).

Dzięki, jak zwykle jesteś niezawodny.

-- 
Marcin
Re: ssh, mkdir i zmienne w skrypcie
#907851
Author: marrgol
Date: Sat, 26 Oct 2024 20:41
30 lines
2825 bytes
On 2024-10-26 at 01:18 Marcin Debowski wrote:
>> W poleceniu 'ZM1=~/foo echo $ZM1' za $ZM1 shell podstawia znaną sobie starą
>> wartość ZM1 z bieżącego środowiska (albo pustą, jeśli ZM1 nie istnieje)
>> _zanim_ wykona całe polecenie.  Natomiast samodzielne przypisanie zmiennej
> 
> Ok, chyba coś zaczyna do mnie docierać... 
> A we fragmencie bash -c 'echo $ZM1' 
> 
> ...nie podstawia bo traktuje jako 'string'. Ale nowa powłoka z 
> właściwości opcji -c traktuje ten sam string jako dalsze argumenty (nie 
> wywala command not found). Tak?

Prawie.  String objęty apostrofami to jest jeden argument, czyli
w nomenklaturze shella jedno słowo (token).  Opcja -c nakazuje
bashowi potraktować _pierwszy_ argument -- w tym przypadku cały ten string
-- jako polecenie do wykonania.  Mówiąc obrazowo nakazuje mu: przepisz sobie
tekst pierwszego argumentu do linii poleceń i zrób to samo co robisz kiedy
użytkownik interaktywnie wpisze linię tekstu i wciśnie [Enter] -- rozwiń/
zinterpretuj tę linię i wykonaj.

Jeśli argumentów (słów/tokenów) jest więcej, to bash przypisze drugi
i następne zmiennym pozycyjnym $0, $1 itd. w swoim środowisku, więc można
je wykorzystać już w tym poleceniu powstającym z pierwszego argumentu
(coś à la przekazywanie parametrów funkcjom w językach programowania), np.:

$ ZM1=STARA
$ ZM1=NOWA bash -c 'echo ZM1=\"$ZM1\" \$0=\"$0\" \$1=\"$1\" \$2=\"$2\"
\$3=\"$3\"' $ZM1 ALA 'MA KOTA'
ZM1="NOWA" $0="STARA" $1="ALA" $2="MA KOTA" $3=""
$
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads