Podany katalog: /media/foo/can haz/bar
, Próbowałem edytować bash.rc z:
export Foo=/media/foo/can haz/bar
export Foo=/media/foo/can\ haz/bar
export Foo='/media/foo/can haz/bar'
export Foo="/media/foo/can haz/bar"
export Foo='"/media/foo/can haz/bar"'
export Foo="'/media/foo/can haz/bar'"
Za każdym razem nie mogłem jednak uzyskać czegoś takiego jak poniżej (bez użycia "$Foo"
):
cd $Foo
Jak ustawić zmienną środowiskową ze spacjami w systemie Linux?
Odpowiedzi:
Problemem nie jest to, że zmienna środowiskowa zawiera spację. Zapominasz o cytuj swoje argumenty :
Jeśli nie cytujesz
$Foo
, thecd
polecenie rzeczywiście zobaczy dwa (lub więcej) argumenty, ponieważ białe znaki domyślnie oddzielają argumenty . W twoim konkretnym przypadku zdasz/media/foo/can
ihaz/bar
oddzielnie, ponieważ powłoka dzieli je w przestrzeni. Zmienne z podwójnym cytowaniem są dobrym nawykiem do rozwijania i pozwalają zaoszczędzić w wielu przypadkach, w które zaangażowane są białe znaki.Jeśli chcesz naprawdę brzydki sposób na osiągnięcie tego bez cytatów, nadpisz swój
cd
wbudowany tak:To zadziała, jeśli ścieżka zawiera spacje, ponieważ
$*
będzie zawierać indywidualne argumenty (/media/foo/can
ihaz/bar
), oddzielone pierwszym znakiem IFS (zazwyczaj spacją), a następnie sklej je razem z podwójnymi cudzysłowami.Jednak nigdy nie jest dobrym pomysłem nadpisywanie takich wbudowanych plików.
źródło
Jak powiedział @slhck, właściwym sposobem na to jest umieszczenie podwójnych cudzysłowów wokół zmiennej referencyjnej (np.
cd "$Foo"
). Powodem tego jest kolejność, w jakiej powłoka analizuje różne aspekty linii poleceń: najpierw skanuje w poszukiwaniu cudzysłowów i ucieczek (i usuwa je, gdy stosuje swoje efekty), a następnie zastępuje zmienne odniesienia swoimi wartościami (np.$Foo
- & gt;/media/foo/can haz/bar
), następnie powraca przez zastąpione wartości i stosuje rozszerzenie wieloznaczne (*.txt
- & gt;a.txt b.txt
itp.) i dzielenie słów (/media/foo/can haz/bar
- & gt; „/ media / foo / can” „haz / bar”), ale nigdy nie wraca i szuka cudzysłowów i / lub ucieczek w wartościach zmiennych. W rezultacie osadzanie cudzysłowów i / lub ucieczek w wartości zmiennej ma nic nawet trochę użytecznego ; zanim staną się częścią linii poleceń, jest już za późno na zamierzony efekt. Znam tylko trzy sposoby uniknięcia dzielenia wyrazów na rozszerzonej wartości:źródło
cd $Foo
docd /path\ with/spaces
. Znalazłem Bash, aby zrobić to źle, jeśli go uruchomiszCtrl-A-E
, ale od jakiegoś czasu nie używałem Basha, więc może to być również możliwe.