Dlaczego polecenie mkdir kończy się niepowodzeniem: „Brak takiego pliku lub katalogu”?
#!/bin/bash
set -e
BIN_DIR="~/bin/"
if [ ! -d "$BIN_DIR" ]; then
mkdir "$BIN_DIR"
fi
command-line
bash
scripts
home-directory
mkdir
Hendré
źródło
źródło
Odpowiedzi:
Pojawia się komunikat o błędzie, ponieważ
~
zacytowano tyldę , jak opisano w odpowiedzi Zanny . Jeśli chcesz użyć~
, odpowiednią częścią skryptu powinna być:Jeśli z jakiegokolwiek powodu chcesz zacytować ciąg, możesz użyć zmiennej środowiskowej
$HOME
:Moim zdaniem drugim podejściem jest lepsza praktyka.
źródło
~
skryptów. działa dokładnie tak samo, jak w wierszu poleceń. Problem polega na tym, że cytowanie blokuje ekspansję tyldy, jak wyjaśniono w odpowiedzi Zanny .$HOME
w skryptach jest dobrym pomysłem.$HOME
niż używać rozszerzenia tyldy? Jedynym wyjaśnieniem, które podałeś, jest powiedzenie: „to lepszy pomysł, ponieważ powinieneś mniej uważać”. Nie mam pojęcia co to znaczy. Czy możesz to wyjaśnić w edycji? Bez tego nic nie potwierdza twojej odpowiedzi, więc na pewno do niej należy. Tyldy został wymagane przez POSIX na jakiś czas teraz i linia hashbang skrypt jest#!/bin/bash
tak przypuszczam przenośność nie jest powód.To nie działa, ponieważ
~
jest cytowane. Cudzysłowy"
tłumić tyldy ekspansji . Nie ma katalogu o dosłownej nazwie~/bin
. Jak wyjaśniono wman bash
(moje podkreślenie):Możesz usunąć cudzysłowy , ponieważ
~
jest to jedyny znak na ścieżce~/bin
, który spowoduje, że powłoka wykona rozwinięcie, a my chcemy rozwinięcia w tym przypadku. Powłoka nie będzie wykonywać żadnych dalszych rozszerzeń na skutek ekspansji tyldy, przynajmniej w Bash 4 , który wszystkie obecne lub zdalnie ostatnich wydaniach Ubuntu mają . Nawet jeśli katalog domowy zawiera nietypowe znaki, takie jak spacje, jest w porządku.Albo można użyć
$HOME
zamiast z~
, ponieważ ekspansja parametr nie jest tłumione przez cudzysłów, tylko przez pojedynczych cudzysłowach . Podwójne cudzysłowy nie zapewniają, że rozszerzona wartość nie jest sama w sobie przedmiotem dalszych rozwinięć, więc podział na słowa lub rozszerzenie nazwy pliku nie nastąpi.$HOME
Działa więc nawet z dziwnie nazwanymi katalogami domowymi, o ile zachowasz podwójne cudzysłowy.źródło
cd '~'
jest-bash: cd: ~: No such file or directory
.~
nie jest częścią rozszerzenia parametru.