Я хотел бы скопировать содержимое переменной (здесь называется var
) в файл.
Имя файла хранится в другой переменной destfile
.
У меня проблемы с этим. Вот что я пробовал:
cp $var $destfile
Я также пробовал то же самое с командой dd ... Очевидно, оболочка подумала, что $var
это относится к каталогу, и поэтому сказала мне, что каталог не может быть найден.
Как мне обойти это?
$var
имя файла или какой-то текст, который должен быть записан в файл? Если в нем указан текст, то каково имя файла, в который вы хотите записать этот контент?$destdir
следует назвать$destfile
его, чтобы оно не вводило в заблуждение ... Название$destdir
предполагает, что оно указывает каталог, а не файл. Это сделало бы весь ваш вопрос простым и легким для понимания.Ответы:
Используйте
echo
команду:var="text to append"; destdir=/some/directory/path/filename if [ -f "$destdir" ] then echo "$var" > "$destdir" fi
В
if
тестах , которые$destdir
представляют файл.>
Добавляет текст после усечения файла. Если вы хотите только добавить текст в$var
существующее содержимое файла, используйте>>
вместо этого:echo "$var" >> "$destdir"
Команда
cp
используется для копирования файлов (в файлы), а не для записи текста в файл.источник
]
ин"$destdir"]
.echo
также добавляет завершающую новую строку к вашей переменной.$var
есть-e text to append
, а на самом деле does't написать-e
echo $var
он полагается на оболочку для расширения вашей переменной, он не очень хорошо работает с такими вещами, как пробелы и специальные символы. Вы можете использоватьperl -e 'print($ENV{var})'
вместо этого, и он будет выводить точное значение переменной.echo
имеет проблему, что если онvar
содержит что-то подобное-e
, он будет интерпретирован как флаг. Другой вариантprintf
, ноprintf "$var" > "$destdir"
он расширит любые экранированные символы в переменной, поэтому, если переменная содержит обратную косую черту, содержимое файла не будет совпадать. Однако, посколькуprintf
обратная косая черта интерпретируется только как экранирование в строке формата, вы можете использовать%s
спецификатор формата для сохранения точного содержимого переменной в файле назначения:printf "%s" "$var" > "$destdir"
источник
echo "$var" > destfile
неправильно.printf
лучше, продолжайте.Ни один из приведенных выше ответов не работает, если ваша переменная:
-e
-n
-E
\
за которым следуетn
и поэтому на них нельзя полагаться для произвольного содержимого строки.
В bash вы можете использовать «здесь строки» как:
cat <<< "$var" > "$destdir"
Как отмечено в комментарии ниже, использование ответа @ Trebawa (сформулированного в той же комнате, что и моя!)
printf
- лучший подход.источник
printf
overcat
заключается в том, что первая - это встроенная оболочка, которая всегда будет выполняться быстрее, чем внешний двоичный файл.Если я вас правильно понял, вы хотите скопировать
$var
в файл (если это строка).echo $var > $destdir
источник
cp
команды заставит оболочку интерпретировать первый аргумент как имя файла или каталога.$var
в кавычки, в некоторых случаях содержимое файла не на 100% совпадает с содержимым $ var. Например, при "повторении" переменных, содержащих ключи RSA, вы получите недопустимый ключ в файле.$var
содержит пробелы или-e
Когда вы говорите «копировать содержимое переменной», эта переменная содержит имя файла или имя файла?
Я предполагаю, что ваш вопрос
$var
содержит содержимое, которое вы хотите скопировать в файл:$ echo "$var" > "$destdir"
Это отобразит значение $ var в файл с именем $ destdir. Обратите внимание на цитаты. Очень важно заключить "$ var" в кавычки. Также для "$ destdir", если в имени есть пробел. Чтобы добавить это:
$ echo "$var" >> "$destdir"
источник
var
содержит-e
echo
завершения списка опций, таким образом, решает проблему, поднятую @Eric:echo -- "$var" >> "$destfile"
Все вышеперечисленное работает, но также необходимо обойти проблему (экраны и специальные символы), которая не должна возникать в первую очередь: специальные символы, когда переменная раскрывается оболочкой. Просто не делайте этого (расширение переменных) в первую очередь. Используйте переменную напрямую, без расширения.
Кроме того, если ваша переменная содержит секрет, и вы хотите скопировать этот секрет в файл, вам может потребоваться не использовать расширение в командной строке, поскольку отслеживание / эхо команд команд оболочки может раскрыть секрет. Это означает, что все ответы, которые используются
$var
в командной строке, могут иметь потенциальную угрозу безопасности, поскольку содержимое переменной подвергается трассировке и ведению журнала оболочки.Использовать это:
Это означает, что в случае вопроса OP:
printenv var >"$destfile"
источник