Ваше понимание в основном правильное, но есть пара дополнительных моментов, которые следует учитывать:
/lib
будет библиотеками, скомпилированными в машинный код. cat
, используются в сценарии оболочки, например вызовы кода в библиотеках, они не являются библиотеками в смысле FHS, поскольку могут запускаться сами по себе. В результате этих пунктов,более распространенная терминология среди людей, которые не пишут документы по стандартам,:
Объектные файлы :Они представляют собой машинный код, скомпилированный в собственном коде, но могут даже не запускаться и не вызываться. Обычно они имеют расширение .o
, если они не попадают ни в одну из других категорий, и почти никогда не встречаются в большинстве систем, за исключением случаев создания программного обеспечения. Я перечислил их здесь, потому что они важны для понимания следующих вещей.
Исполняемые файлы :Это файлы, состоящие в основном из автономного кода, который можно запускать напрямую. Они могут быть либо специально отформатированными объектными файлами, которые могут быть загружены непосредственно ядром (такие вещи, как cat
, bash
и python
, все это тип исполняемого файла ), либо интерпретируются какой-либо промежуточной программой. который сам по себе является исполняемым файлом (Minecraft, pydoc
и cowsay
— все это примеры исполняемого файла этого типа ). Исполняемые файлы первого типа почти никогда не имеют расширения файла в системах UNIX, в то время как исполняемые файлы второго типа могут иметь или не иметь. Это то, что FHS называет «двоичными файлами». Они могут запускаться из других исполняемых файлов, но требуют вызова специальных функций для их вызова(fork()
и exec()
в C и C++, вещей из модуля subprocess
в Python и т. д. )и выполняются как отдельный процесс.
Библиотеки :Это файлы, содержащие многократно используемый код, который может вызываться другой библиотекой или исполняемым файлом. Код в библиотеках вызывается (в основном )непосредственно другим кодом после загрузки библиотеки (упоминается как «связывание», когда речь идет о скомпилированном коде ), и выполняется в том же процессе, что и вызывающий его код. Существует три общих типа библиотек:
.a
. Концепция статических библиотек на самом деле не существует вне скомпилированных языков программирования. .so
в UNIX(.dll
— это стандарт в Windows ), который загружается во время выполнения исполняемыми файлами, которые его используют. Большая часть того, что вы найдете в /lib
в производственных системах, — это динамические библиотеки. http.server
в стандартной библиотеке Python ).. Вы можете использовать Awk
, обрабатывая оба файла, сохраняя содержимое одного файла в системной памяти, а другое — по мере его повторения.
awk 'FNR==NR{ words[NR]=$0; next}{ if ($0 ~ /^#/) $0 = $0 words[++idx]; print }' rename main
Краткое объяснение того, как это работает
FNR==NR{ words[NR]=$0; next}
работает с первым файлом rename
, индексируя содержимое вашего файла в массиве words
. NR
— это специальная переменная в Awk
, которая отслеживает текущий номер строки. Таким образом, массив становится чем-то вродеwords['1']="yellow", words['2']="white"
{..}
теперь работает со следующим файлом rename
, и если строка соответствует #
, мы обновляем текущую строку $0
, добавляя элемент из созданного массива. print
печатает строку со строкой, добавленной после #
, для тех строк, которые начинаются с нее, и другие строки, такие как -. Вот метод, использующий пасту . Во-первых, удвоить -пробел во втором файле, чтобы интересные строки были параллельны. Во-вторых, склеить эти строки вместе, используя значение \0 или NUL, которое по сути не отображается как пробел. Мы можем использовать ряд схем для удвоения -интервала вывода, но вставка удобна (, например sed , как уже отмечалось, *для других см. Как я могу удвоить символы новой строки в выходном потоке).
Отображение двух исходных файлов предполагает выравнивание, которое можно выполнить с помощью двойного -интервала. Вставка двух файлов с использованием разделителя по умолчанию просто показывает это выравнивание. Реальный ответ представлен двумя способами: стандартный способ с использованием временного файла, второй с использованием подстановки процесса.
Вот фрагмент скрипта:
FILE1=${1-data1}
shift
FILE2=${1-data2}
E="expected-output"
# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
pl " Input $FILE1 and $FILE2, columnized to save visual space:"
paste $FILE1 $FILE2 | expand -30
pl " Expected output:"
cat $E
rm -f t0
pl " Results, paste with double-space $FILE2, default options:"
# sed '/^$/d;G' $FILE2 > t0
paste -d '\n' - /dev/null < $FILE2 > t0
paste $FILE1 t0
pl " Results with paste of NUL, \0:"
paste -d'\0' $FILE1 t0
pl " Results with paste, process substitution:"
paste -d'\0' $FILE1 <( sed '/^$/d;G' $FILE2 )
производство:
Input data1 and data2, columnized to save visual space:
# yellow
stars white
# green
twinkle red
# blue
on
#
the
#
sky
-----
Expected output:
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky
-----
Results, paste with double-space data2, default options:
# yellow
stars
# white
twinkle
# green
on
# red
the
# blue
sky
-----
Results with paste of NUL, \0:
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky
-----
Results with paste, process substitution:
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky
ЭТО было сделано в такой системе, как:
OS, ker|rel, machine: Linux, 3.16.0-7-amd64, x86_64
Distribution : Debian 8.11 (jessie)
bash GNU bash 4.3.30
paste (GNU coreutils) 8.23
ура, дрл
Это довольно легко сделать одним paste
вызовом
<main paste -d '\0\n' - rename -
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky
Когда в списке разделителей, переданном в -d
, paste
используется несколько разделителей, последовательно используются эти разделители до тех пор, пока они не будут исчерпаны, а затем начинается с них снова. В приведенной выше команде переданы два разделителя:\0
(пустая строка )и\n
(новая строка ). Стандартный ввод указывает на файл main
, который затем дважды упоминается внутри команды через два -
,все это ведет к строке вывода, формируемой
main
и rename
и добавить ее к приведенной выше main
И так далее