Вне шоу LFS Вы, как добавить дополнительные пакеты к LFS вне минимальной установки. Но LFS/BLFS действительно не предоставляет Вам хороший способ создать Живой CD.
У хинду, другого основанного на источнике распределения, есть пошаговое руководство для того, чтобы сделать пользовательский хинду Живой CD/DVD. Если Вы хотите создать пользовательское основанное на источнике распределение, это - вероятно, Ваша лучшая начальная точка.
] Вот еще один способ:[
] [$ stat filename && file "$_"
]
[] Пример:[
] [$ stat /usr/bin/yum && file "$_"
File: ‘/usr/bin/yum’
Size: 801 Blocks: 8 IO Block: 4096 regular file
Device: 804h/2052d Inode: 1189124 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:rpm_exec_t:s0
Access: 2014-06-11 22:55:53.783586098 +0700
Modify: 2014-05-22 16:49:35.000000000 +0700
Change: 2014-06-11 19:15:30.047017844 +0700
Birth: -
/usr/bin/yum: Python script, ASCII text executable
]
[] Это работает в [] bash[
] и []zsh[
]. Это также работает в []mksh[
] и []dash[
], но только в интерактивном режиме. В AT&T ksh это работает только тогда, когда файл [] "$_"[
] находится на другой строке, чем [] stat[
].[
]Способ, который я нашел, чтобы сделать это разумно просто использовать xargs, он берет файл / трубку и преобразует его содержимое в аргументы программы . Это можно комбинировать с tee, который разделяет поток и посылает его на две или более программ, В вашем случае вам нужно:[
] [echo filename | tee >(xargs stat) >(xargs file) | cat
]
[]В отличие от многих других ответов, это будет работать в bash и большинстве других оболочек под Linux. Я бы предположил, что это хороший вариант использования переменной, но если вы абсолютно не можете ее использовать, то это лучший способ сделать это только с помощью труб и простых утилит (предполагая, что у вас нет особенно модной оболочки командной строки).[
] []Кроме того, вы можете сделать это для любого количества программ, просто добавив их так же, как эти две после tee.[
] [][]EDIT[][
] []Как предполагается в комментариях, в этом ответе есть пара недостатков, первый из них - потенциал для вывода чересстрочной развертки. Это можно исправить следующим образом:[
] [echo filename | tee >(xargs stat) >(( wait $!; xargs file )) | cat
]
[]Это заставит команды выполняться по очереди и вывод никогда не будет чересстрочным.[
] []Вторая проблема заключается в том, чтобы избежать подстановки процесса, которая недоступна в некоторых оболочках, это может быть достигнуто с помощью tpipe вместо tee, так как:[
] [echo filename | tpipe 'xargs stat' | ( wait $!; xargs file )
]
[]Это должно быть переносимо почти на любую оболочку (я надеюсь) и решает проблемы в другой похвале, однако я пишу эту последнюю из памяти, так как моя текущая система не имеет tpipe.[
].] Это должно работать для всех имен файлов в текущем каталоге.[
] [sh -c "$(printf 'stat -- "$1";file -- "$1";shift%.0b\n' *)" -- *
] ] Это похоже на пару других ответов, но более переносимый, чем [] этот []. и гораздо проще, чем [] эта []: [
] [sh -c 'stat "$0"; file "$0"' filename] [
] или [
] [sh -c 'stat "$1"; file "$1"' sh filename] [
], в которой []sh [
] присваивается []$0 [
].
Хотя для ввода требуется еще три символа,
эта (вторая) форма предпочтительнее
потому что [] $0[
] - это имя, которое вы даете этому встроенному сценарию.
Оно используется, например, в сообщениях об ошибках оболочкой для этого скрипта,
например, когда файл []file[
] или []stat[
] не может быть найден или не может быть выполнен.
по любой причине. [
] Если вы хотите сделать [
] [stat filename1 filename2 filename3 …; file filename1 filename2 filename3 …] [
] для произвольного количества файлов, сделайте [
] [sh -c 'stat "$@"; file "$@"' sh filename1 filename2 filename3 …] [
], что работает, потому что [] "$@" [
] эквивалентно [] "$1" "$2" "$3" ...[
].[
Все эти ответы в большей или меньшей степени кажутся мне сценариями. Для решения, которое действительно не включает в себя никакой скриптинг и предполагает, что вы сидите за клавиатурой и печатаете в оболочке, вы можете попробовать:
stat somefile Enter file Esc_ Enter
В режиме bash, zsh и ksh, по крайней мере, как в режиме vi, так и в режиме emacs, нажав Escape, а затем подчеркнув, вставляет последнее слово из предыдущей строки в буфер редактирования для текущей строки.
Или вы можете использовать подстановку истории:
stat somefile Enter file !$ Enter
В bash, zsh, csh, tcsh и большинстве других оболочек, !$
при разборе текущей командной строки заменяется последним словом из предыдущей строки.
Здесь есть несколько различных ссылок на "input", поэтому сначала я приведу несколько сценариев, чтобы понять это. Для быстрого ответа на вопрос в кратчайшем виде:
stat testfile < <($1)> outputfile
Выше приведена статистика тестового файла, возьмите (перенаправьте) его STDOUT и включите его в следующую специальную функцию (часть <()), а затем выведите окончательные результаты того, что было, в новый файл (выходной файл). Файл вызывается, затем на него ссылаются с помощью bash built-ins (каждый раз по $1 после, пока вы не начнете новый набор инструкций).
Ваш вопрос великолепен, и есть несколько ответов и способов сделать это, но он действительно меняется с тем, что вы делаете конкретно.
Например, вы можете закольцовывать и это, что очень удобно. Обычно это используется в psuedo-коде мышления, это:
run program < <($output_from_program)> my_own.log
Взяв это и расширив это знание, вы можете создать такие вещи, как:
ls -A; (while read line; do printf "\e[1;31mFound a file\e[0m: $line\n"; done) < <(/bin/grep thatword * | /usr/bin/tee -a files_that_matched_thatword)
Это выполнит простое ls -A в вашем текущем каталоге, затем скажите во время циклической обработки каждого результата от ls -A до (и вот где это сложно!) grep "thatword" в каждом из этих результатов, и только выполните предыдущее printf (красным цветом), если он действительно нашел файл с "thatword" в этом файле. Он также запишет результаты grep в новый текстовый файл files_that_matched_ thatword.
Пример вывода:
ls -A; (while read line; do printf "\e[1;31mFound a file\e[0m: $line\n"; done) < <(/bin/grep thatword * | /usr/bin/tee -a files_that_matched_thatword)
index.html
Все это просто распечатало результат ls -A, ничего особенного. Добавьте что-нибудь в grep на этот раз:
echo "thatword" >> newfile
Теперь перезапустите его:
ls -A; (while read line; do printf "\e[1;31mFound a file\e[0m: $line\n"; done) < <(/bin/grep thatword * | /usr/bin/tee -a files_that_matched_thatword)
files_that_matched_thatword index.html newfile
Found a file: newfile:thatword
Хотя, возможно, более изнурительный ответ, чем тот, который вы ищете в настоящее время, я думаю, что сохранение таких удобных заметок принесет вам гораздо больше пользы в будущих начинаниях.
Я думаю, ты задаешь неправильный вопрос, по крайней мере, за то, что ты пытаешься сделать.
Команды stat
и file
принимают параметры, которые являются именем файла, а не его содержимым. Далее идет команда, которая считывает файл, идентифицируемый указанным Вами именем.
Трубка должна иметь два конца, один из которых используется в качестве входного, а другой - в качестве выходного, и это имеет смысл, так как на этом пути может потребоваться различная обработка с помощью разных инструментов до тех пор, пока не будет получен нужный результат. Говорить, что вы знаете, как подключать выходы, но не знаете, как подключать входы, в принципе неправильно.
В вашем случае трубка вообще не нужна, так как вы должны предоставить ввод в виде имени файла. И даже если эти инструменты (stat
и file
) будут читать stdin, труба здесь опять не имеет значения, так как ввод не должен быть изменен ни одним из инструментов, когда он попадает во второй.
Наверное, меня за это костяшки разорвут, вот халтурная комбинация из бэш-брекетов и eval, которая, кажется, выполняет трюк
eval {stat,file}" fileName;"
С помощью zsh
можно использовать анонимные функции:
(){stat $1; file $1} filename
С помощью es
lambdas:
@{stat $1; file $1} filename
Вы также можете сделать:
{ stat -; file -;} < filename
(сначала выполните stat
, так как файл
обновит время доступа).
Я бы сделал:
f=filename; stat "$f"; file "$f"
хотя, для этого и нужны переменные.
Этот ответ аналогичен ответу пары других:
stat filename && file !#:1
В отличие от других ответов, которые автоматически повторяют последний аргумент - из предыдущей команды, этот ответ требует, чтобы вы считали:
ls -ld filename && file !#:2
В отличие от некоторых других ответов, для этого не требуются кавычки:
stat "useless cat" && file !#:1
или
echo Sometimes a '$cigar' is just a !#:3.