Выполните две команды на одном аргументе (не пишущий сценарий)

Вне шоу LFS Вы, как добавить дополнительные пакеты к LFS вне минимальной установки. Но LFS/BLFS действительно не предоставляет Вам хороший способ создать Живой CD.

У хинду, другого основанного на источнике распределения, есть пошаговое руководство для того, чтобы сделать пользовательский хинду Живой CD/DVD. Если Вы хотите создать пользовательское основанное на источнике распределение, это - вероятно, Ваша лучшая начальная точка.

28
13.06.2014, 18:20
10 ответов
[

] Вот еще один способ:[

] [
$ 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[].[

].
22
27.01.2020, 19:38
[

]Способ, который я нашел, чтобы сделать это разумно просто использовать 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.[

].
3
27.01.2020, 19:38
[

] Это должно работать для всех имен файлов в текущем каталоге.[

] [
sh -c "$(printf 'stat -- "$1";file -- "$1";shift%.0b\n' *)" -- *
]
1
27.01.2020, 19:38
[

] Это похоже на пару других ответов, но более переносимый, чем [] этот []. и гораздо проще, чем [] эта []: [

] [
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" ...[].[

].
2
27.01.2020, 19:38

Все эти ответы в большей или меньшей степени кажутся мне сценариями. Для решения, которое действительно не включает в себя никакой скриптинг и предполагает, что вы сидите за клавиатурой и печатаете в оболочке, вы можете попробовать:

stat somefile Enter
file Esc_   Enter

В режиме bash, zsh и ksh, по крайней мере, как в режиме vi, так и в режиме emacs, нажав Escape, а затем подчеркнув, вставляет последнее слово из предыдущей строки в буфер редактирования для текущей строки.

Или вы можете использовать подстановку истории:

stat somefile Enter
file !$ Enter

В bash, zsh, csh, tcsh и большинстве других оболочек, !$ при разборе текущей командной строки заменяется последним словом из предыдущей строки.

9
27.01.2020, 19:38

Здесь есть несколько различных ссылок на "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

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

1
27.01.2020, 19:38

Я думаю, ты задаешь неправильный вопрос, по крайней мере, за то, что ты пытаешься сделать. Команды stat и file принимают параметры, которые являются именем файла, а не его содержимым. Далее идет команда, которая считывает файл, идентифицируемый указанным Вами именем.

Трубка должна иметь два конца, один из которых используется в качестве входного, а другой - в качестве выходного, и это имеет смысл, так как на этом пути может потребоваться различная обработка с помощью разных инструментов до тех пор, пока не будет получен нужный результат. Говорить, что вы знаете, как подключать выходы, но не знаете, как подключать входы, в принципе неправильно.

В вашем случае трубка вообще не нужна, так как вы должны предоставить ввод в виде имени файла. И даже если эти инструменты (stat и file) будут читать stdin, труба здесь опять не имеет значения, так как ввод не должен быть изменен ни одним из инструментов, когда он попадает во второй.

1
27.01.2020, 19:38

Наверное, меня за это костяшки разорвут, вот халтурная комбинация из бэш-брекетов и eval, которая, кажется, выполняет трюк

eval {stat,file}" fileName;"
32
27.01.2020, 19:38

С помощью zsh можно использовать анонимные функции:

(){stat $1; file $1} filename

С помощью es lambdas:

@{stat $1; file $1} filename

Вы также можете сделать:

{ stat -; file -;} < filename

(сначала выполните stat, так как файл обновит время доступа).

Я бы сделал:

f=filename; stat "$f"; file "$f"

хотя, для этого и нужны переменные.

28
27.01.2020, 19:38

Этот ответ аналогичен ответу пары других:

stat filename  &&  file !#:1

В отличие от других ответов, которые автоматически повторяют последний аргумент - из предыдущей команды, этот ответ требует, чтобы вы считали:

ls -ld filename  &&  file !#:2

В отличие от некоторых других ответов, для этого не требуются кавычки:

stat "useless cat"  &&  file !#:1

или

echo Sometimes a '$cigar' is just a !#:3.
3
27.01.2020, 19:38

Теги

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