Chciałbym skopiować zawartość zmiennej (nazywanej tutaj var
) do pliku.
Nazwa pliku jest przechowywana w innej zmiennej destfile
.
Mam z tym problem. Oto, czego próbowałem:
cp $var $destfile
Próbowałem też tego samego z poleceniem dd ... Oczywiście powłoka pomyślała, że $var
odnosi się do katalogu, więc powiedziała mi, że nie można znaleźć katalogu.
Jak mam to obejść?
$var
określa nazwę pliku lub tekst, który powinien zostać zapisany w pliku? Jeśli określa tekst, to jaka jest nazwa pliku, do którego chcesz zapisać tę treść?$destdir
powinno być nazwane,$destfile
aby nie wprowadzało w błąd ... Nazwa$destdir
sugeruje, że określa katalog, a nie plik. To sprawi, że całe twoje pytanie będzie jasne i łatwe do zrozumienia.Odpowiedzi:
Użyj
echo
polecenia:var="text to append"; destdir=/some/directory/path/filename if [ -f "$destdir" ] then echo "$var" > "$destdir" fi
Do
if
testów, które$destdir
reprezentuje plik.>
Dołącza tekst po obcinanie pliku. Jeśli chcesz tylko dołączyć tekst$var
do istniejącej zawartości pliku, użyj>>
zamiast tego:echo "$var" >> "$destdir"
cp
Polecenie służy do kopiowania plików (plików), a nie do pisania tekstu do pliku.źródło
]
in"$destdir"]
.echo
dodaje również końcowy znak nowej linii do zmiennej.$var
jest-e text to append
, i tak naprawdę nie pisze-e
echo $var
polega na rozszerzeniu zmiennej przez powłokę, nie działa to zbyt dobrze w przypadku takich rzeczy, jak białe znaki i znaki specjalne. Możesz użyćperl -e 'print($ENV{var})'
zamiast tego, a wyświetli dokładnie wartość zmiennej.echo
ma problem, że jeślivar
zawiera coś podobnego-e
, zostanie zinterpretowane jako flaga. Inną opcją jestprintf
, aleprintf "$var" > "$destdir"
rozwinie wszelkie znaki ucieczki w zmiennej, więc jeśli zmienna zawiera ukośniki odwrotne, zawartość pliku nie będzie zgodna. Jednak, ponieważprintf
odwrotne ukośniki są interpretowane tylko jako znaki specjalne w ciągu formatu, można użyć specyfikatora%s
formatu do przechowywania dokładnej zawartości zmiennej w pliku docelowym:printf "%s" "$var" > "$destdir"
źródło
echo "$var" > destfile
źle.printf
jest lepiej, idź dalej.Żadna z powyższych odpowiedzi nie działa, jeśli zmienna:
-e
-n
-E
\
po którym następujen
dlatego nie można na nich polegać w przypadku arbitralnej zawartości ciągów.
W bashu możesz użyć „ciągów tutaj” jako:
cat <<< "$var" > "$destdir"
Jak zauważono w komentarzu poniżej, odpowiedź @ Trebawa (sformułowana w tym samym pokoju co moja!)
printf
Jest lepszym podejściem.źródło
printf
nacat
to, że były to wbudowane powłoki, która zawsze będzie wykonać szybciej niż zewnętrznego binarny.Jeśli dobrze cię zrozumiałem, chcesz skopiować
$var
do pliku (jeśli jest to ciąg).echo $var > $destdir
źródło
cp
polecenia spowoduje, że powłoka zinterpretuje pierwszy argument jako nazwę pliku lub katalogu.$var
w cudzysłów, zawartość pliku nie jest w 100% równa zawartości zmiennej $ var w niektórych przypadkach. Na przykład, gdy "echo" vars zawiera klucze RSA, otrzymasz nieprawidłowy klucz w pliku.$var
zawiera spacje lub-e
Kiedy mówisz „kopiuj zawartość zmiennej”, czy ta zmienna zawiera nazwę pliku, czy też nazwę pliku?
Zakładam, że Twoje pytanie
$var
zawiera zawartość, którą chcesz skopiować do pliku:$ echo "$var" > "$destdir"
Spowoduje to odzwierciedlenie wartości $ var w pliku o nazwie $ destdir. Zwróć uwagę na cytaty. Bardzo ważne jest, aby znak „$ zmienna” był ujęty w cudzysłów. Również dla „$ destdir”, jeśli w nazwie jest spacja. Aby dołączyć:
$ echo "$var" >> "$destdir"
źródło
var
zawiera-e
echo
kończącego listę opcji, rozwiązuje w ten sposób problem poruszony przez @Eric:echo -- "$var" >> "$destfile"
Wszystkie powyższe działają, ale muszą również obejść problem (znaki specjalne i znaki specjalne), który nie musi występować w pierwszej kolejności: Znaki specjalne, gdy zmienna jest rozwijana przez powłokę. Po prostu tego nie rób (rozwijanie zmiennych) w pierwszej kolejności. Użyj zmiennej bezpośrednio, bez rozwijania.
Ponadto, jeśli zmienna zawiera sekret i chcesz skopiować ten sekret do pliku, możesz chcieć nie używać interpretacji w wierszu poleceń, ponieważ śledzenie / echo poleceń poleceń powłoki może ujawnić sekret. Oznacza to, że wszystkie odpowiedzi, które są używane
$var
w wierszu poleceń, mogą stwarzać potencjalne zagrożenie bezpieczeństwa, narażając zawartość zmiennej na śledzenie i rejestrowanie powłoki.Użyj tego:
Oznacza to, że w przypadku pytania PO:
printenv var >"$destfile"
źródło