Как в Linux консоли добавить в файл сразу несколько строк

Тоже распространённая задача — вставить в файл из консоли сразу несколько строк. Но есть нюанс, в зависимости от выбора способа вставки командный интерпретатор будет, пытаться заменить переменные на их значения, или нет. Т.е. если в строке для вставки присутствует символ $, то нужно выбрать правильный способ для описания команды.

Рассмотрим на примере строк:

    public function __construct(LoggerInterface $logger) {
        $this->logger = $logger;
    }

В данном случае важно чтобы интерпретатор командной строки не попытался заменить фрагменты $logger и $this значениями из переменных окружения. Ведь в лучшем случае он заменит это на пустую подстроку, ведь вряд ли будет существовать переменная окружения с таким названием, а в худшем случае — содержимым этой переменной окружения. Одним из самых удобных способов описания многострочных значений в консоли является синтаксис HERE DOC.

Рассмотрим способ как можно избежать подстановки переменных окружения:

cat >> file.php << 'END'
    public function __construct(LoggerInterface $logger) {
        $this->logger = $logger;
    }
END

Обратите внимание, что END в первой строке указан в кавычках. Это необходимо для так называемого disable quoting, что уведомляет интерпретатор о том, что подставлять переменных не нужно.

Точно также это работает и с командой tee:

tee file.php << 'END'
    public function __construct(LoggerInterface $logger) {
        $this->logger = $logger;
    }
END

Ещё один способ отключить подстановку переменных — добавить экранирование каждого символа $  добавив перед ним косую черту — \$.

Существует ещё множество способов сделать это, но в большинстве случаев это костыли, требующие выполнения дополнительных команд, например, предварительного сохранения содержимого в файл или написания команды echo для каждой новой строки.