Как я могу записать heredoc в файл в скрипте Bash?

dict.copy () - функция мелкой копии для словаря id - встроенная функция, которая дает вам адрес переменной

. Сначала вам нужно понять: «Почему эта конкретная проблема происходит?»

In [1]: my_dict = {'a': [1, 2, 3], 'b': [4, 5, 6]}

In [2]: my_copy = my_dict.copy()

In [3]: id(my_dict)
Out[3]: 140190444167808

In [4]: id(my_copy)
Out[4]: 140190444170328

In [5]: id(my_copy['a'])
Out[5]: 140190444024104

In [6]: id(my_dict['a'])
Out[6]: 140190444024104

Адрес списка, присутствующего в dicts для ключа 'a', указывает на то же местоположение. Поэтому, когда вы изменяете значение списка в my_dict, также изменяется список в my_copy.


Решение:

In [7]: my_copy = {key: value[:] for key, value in my_dict.items()}

In [8]: id(my_copy['a'])
Out[8]: 140190444024176

Или вы можете использовать глубокую копию, как указано выше.

665
задан Micha Wiedenmann 4 December 2018 в 13:11
поделиться

2 ответа

Прочтите Расширенное руководство по сценариям на Bash , глава 19. Здесь документы .

Вот пример, который запишет содержимое в файл по адресу / tmp / yourfilehere

cat << EOF > /tmp/yourfilehere
These contents will be written to the file.
        This line is indented.
EOF

Обратите внимание, что последний 'EOF' ( LimitString ) не должен иметь пробелов перед слово, потому что это означает, что LimitString не будет распознан.

В сценарии оболочки вы можете захотеть использовать отступ, чтобы сделать код читаемым, однако это может иметь нежелательный эффект в виде отступа текста в вашем документе здесь. В этом случае используйте << - (за которым следует тире), чтобы отключить ведущие табуляции ( Обратите внимание , что для проверки вам потребуется заменить начальный пробел табуляцией , так как я не могу напечатать здесь настоящие символы табуляции.)

#!/usr/bin/env bash

if true ; then
    cat <<- EOF > /tmp/yourfilehere
    The leading tab is ignored.
    EOF
fi

Если вы не хотите интерпретировать переменные в тексте, используйте одинарные кавычки:

cat << 'EOF' > /tmp/yourfilehere
The variable $FOO will not be interpreted.
EOF

Чтобы передать heredoc через конвейер команд:

cat <<'EOF' |  sed 's/a/b/'
foo
bar
baz
EOF

] Вывод:

foo
bbr
bbz

... или записать heredoc в файл с помощью sudo :

cat <<'EOF' |  sed 's/a/b/' | sudo tee /etc/config_file.conf
foo
bar
baz
EOF
982
ответ дан 22 November 2019 в 21:37
поделиться

Для будущих людей, которые могут столкнуться с этой проблемой, работает следующий формат:

(cat <<- _EOF_
        LogFile /var/log/clamd.log
        LogTime yes
        DatabaseDirectory /var/lib/clamav
        LocalSocket /tmp/clamd.socket
        TCPAddr 127.0.0.1
        SelfCheck 1020
        ScanPDF yes
        _EOF_
) > /etc/clamd.conf
11
ответ дан 22 November 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: