Предполагая, что env
находится в вашем пути:
env kill -p http
env
запускает исполняемый файл, названный его первым аргументом, в (возможно) измененном окружении; как таковой, он не знает о встроенных командах оболочки и не работает с ними.
Это создает некоторые элементы управления заданиями оболочки, но не полагается на внешнюю команду:
exec kill -p bash &
exec
требует исполняемый файл для замены текущей оболочки, поэтому не использует никаких встроенных команд. Задание выполняется в фоновом режиме, так что вы заменяете форк фоновой оболочки, а не текущую оболочку.
Команда sed
r
поместит содержимое указанного файла в вывод перед чтением следующей строки ввода. К сожалению, вы не можете указать 0
в качестве адреса для этой команды, поэтому нет способа вставить содержимое файла перед первой строкой ввода (не копаясь в удерживаемом пространстве).
Однако вы можете просто использовать старый добрый кот
. В конце концов, это команда для объединения файлов:
$ cat file1.txt file2.txt >out && mv out file2.txt
Чтобы убедиться, что вы записываете во временный файл, который еще не существует, можно использовать утилиту mktemp
:
$ tmp="$(mktemp)" && cat file1.txt file2.txt >"$tmp" && mv "$tmp" file2.txt
Это немного неудобно для командной строки, но является хорошей мерой предосторожности в любом сценарии, который должен записывать во временный файл.
Если вы полны решимости избегать доступа cat
к явному временному файлу (или через буфер, например sponge
), то похоже, что ed
по крайней мере примет 0-адрес для своей команды r
:
ed -s file2.txt << EOF
0r file1.txt
wq
EOF
или эквивалентно
printf '0r file1.txt\nwq\n' | ed -s file2.txt
N
При условии, что file2.txt
имеет более одной строки (иначе см. другой раздел):
sed -i -e '1 { r file1.txt' -e 'N; }' file2.txt
Хитрость заключается в том, чтобы отложить печать первой строки с помощью команды N
.
Из руководства:
N
Добавьте следующую строку ввода в пробел шаблона.
e
При условии, что file2.txt
не пуст (иначе просто сделайте копию):
sed -i -e '1 e cat file1.txt' file2.txt
GNU sed
предоставляет команду e
, которая выполняет команду в параметре. Результат выводится немедленно.
Из руководства:
e [COMMAND]
Эта команда позволяет передавать ввод от команды оболочки в пространство шаблона. Без параметров команда `e' выполняет команду команду, которая находится в пространстве шаблона, и заменяет пространство шаблона и заменяет пространство шаблона на выходной файл; при этом новая строка в конце подавляется.
Если указан параметр, то команда `e' интерпретирует его как команду и отправляет на вывод. как команду и посылает ее вывод в поток вывода.
Обратите внимание, что, в отличие от команды 'r', вывод команды будет будет напечатан немедленно; команда 'r' вместо этого откладывает вывод до конца текущего цикла.