Wypróbowałem różne formy następujących w skrypcie bash:
#!/bin/bash
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
Ale nie mogę uzyskać składni, aby poprawnie rozwinąć COLUMNS
zmienną środowiskową.
Próbowałem różnych form:
svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS'
i
svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}'
i
eval svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
Propozycje?
bash
quotes
environment
Jamie
źródło
źródło
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W ""$COLUMNS"
$@
niecytowanych sprawia, że jest to dokładnie to samo, co$*
- co oznacza, że dzieli się"foo bar"
na dwa oddzielne argumenty,foo
ibar
. Jeśli chcesz zachować oryginalną listę argumentów w takiej postaci, w jakiej została ci ona podana, chcesz"$@"
.Odpowiedzi:
Jeśli nie masz pewności, możesz użyć żądania „cols” na terminalu i zapomnieć o COLUMNS:
źródło
Tylko krótka notatka / podsumowanie dla każdego, kto przyszedł tutaj przez Google, szukając odpowiedzi na ogólne pytanie zadane w tytule (tak jak ja). Aby uzyskać dostęp do zmiennych powłoki wewnątrz cudzysłowów, powinno działać dowolne z poniższych:
echo "$VARIABLE" echo "${VARIABLE}"
Głównym problemem jest stosowanie pojedynczych cudzysłowów. Zgodnie z podręcznikiem Bash Reference Manual :
W konkretnym przypadku zadanym w pytaniu $ COLUMNS jest specjalną zmienną, która ma niestandardowe właściwości (patrz odpowiedź lhunatha powyżej).
źródło
'before'"$variable"'after'
(jak podano w tej odpowiedzi: stackoverflow.com/a/13802438/2254346 )Zauważ, że
COLUMNS
to:SIGWINCH
sygnału.Ten drugi punkt zwykle oznacza, że
COLUMNS
zmienna zostanie ustawiona tylko w powłoce interaktywnej , a nie w skrypcie bash.Jeśli twój skrypt
stdin
jest podłączony do twojego terminala, możesz ręcznie sprawdzić szerokość terminala, pytając terminal:Aby użyć tego w poleceniu SVN:
svn diff "$@" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)"
(Uwaga: należy cytować
"$@"
i trzymać się z dalekaeval
;-))źródło
Poniższy skrypt działa dla mnie dla wielu wartości
$COLUMNS
. Zastanawiam się, czy nie siedziszCOLUMNS
przed tym wezwaniem?#!/bin/bash COLUMNS=30 svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
Czy możesz wywołać echo
$COLUMNS
w swoim skrypcie, aby sprawdzić, czy jest ustawiony poprawnie?źródło
$@
- to dzieli pojedynczy parametr"two words"
na dwa oddzielne parametrytwo
iwords
. Powinien"$@"
przekazywać listę argumentów dokładnie tak, jak została podana.Robisz to dobrze, więc myślę, że coś innego jest winne (nie eksportujesz KOLUMN?).
Sztuczka do debugowania tych przypadków polega na wykonaniu wyspecjalizowanego polecenia (zamknięcie dla facetów od języków programowania). Utwórz skrypt powłoki o nazwie diff-columns, wykonując:
exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "$@"
i po prostu użyj
svn diff "$@" --diff-cmd diff-columns
W ten sposób twój kod jest bardziej czytelny i bardziej modularny (podejście z góry na dół), a także możesz przetestować kod z kolumnami różnicowymi dokładnie oddzielnie (podejście oddolne).
źródło