Dlaczego poniższe elementy bash
sprawdzają, czy katalog nie działa?
if [ ! -d "~/Desktop" ]; then
echo "DOES NOT EXIST"
exit 1;
fi
~/Desktop
naprawdę istnieje. Nawiasem mówiąc, jest to na komputerze Mac.
Problem dotyczy tego typu skryptu
read -p "Provide the destination directory: " DESTINATION
if [ ! -d $DESTINATION ]; then
echo "\t'$DESTINATION' does not exist." >&2;
exit 1;
fi
cd "~/Desktop"
się błąd. Należy go cytować lub zapisać jako zmienną (bez cudzysłowów). Na przykłada=~/Desktop; cd $a;
działa, ale niea="~/Desktop"; cd Desktop;
Zobacz Zobacz serverfault.com/questions/417252Odpowiedzi:
Justin wyjaśnił swoje pytanie w swoim pierwszym komentarzu do odpowiedzi kwanty. Czyta wierszem tekstu
read
(lub innymi dynamicznymi środkami) i chce rozwinąć tyldę.Pytanie brzmi: „W jaki sposób przeprowadzasz interpretację tyldy na zawartości zmiennej?”
Ogólne podejście polega na użyciu
eval
, ale wiąże się z pewnymi ważnymi zastrzeżeniami, mianowicie spacjami i przekierowaniem wyjścia (>
) w zmiennej. Wydaje mi się, że następujące działania:Wypróbuj z każdym z następujących danych wejściowych:
Wyjaśnienie
${mypath//>}
Wycina>
znaków, które mogłyby sprać plik czasieeval
.eval echo ...
co robi rzeczywiste rozszerzenie tyldyeval
służą do obsługi nazw plików ze spacjami.Jako uzupełnienie tego możesz ulepszyć UX, dodając
-e
opcję czytania:Teraz, gdy użytkownik wpisze kartę tyldy i trafień, zostanie rozwinięta. Podejście to nie zastępuje jednak powyższego podejścia ewaluacyjnego, ponieważ rozwinięcie następuje tylko wtedy, gdy użytkownik kliknie kartę. Jeśli po prostu wpisze ~ / foo i uderzy enter, pozostanie to jak tylda.
Zobacz też:
źródło
Usuń podwójne cudzysłowy wokół katalogu, aby zobaczyć, czy to działa:
Powodem tego jest, że rozszerzenie tyldy działa tylko wtedy, gdy nie jest cytowane.
info "(bash) Tilde Expansion"
źródło
DESTINATION
jest~/Desktop
.To nie działa nie tylko na Macu, ale na każdej platformie, na której działa bash.
Kiedy cytujesz „~ / Desktop”, mówisz bash, aby szukał Desktop wewnątrz folderu ~. Cytat usuwa specjalny cel ~
Zobacz - http://www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansion
Usuń podwójne cudzysłowy i powinno działać.
źródło
biegać
użyj
$HOME
i upewnij się, że użytkownik faktycznie używa skryptu. jeśli root użyje~
go/root
, to nie/home/$USER
.źródło
powinno być $ HOME zamiast ~
~ jest KLAWIATURĄ
źródło