bash-скрипт, передающий команду в качестве аргумента

Вы должны рассмотреть возможность использования paprefs.

Необходимо установить:

$ sudo apt install paprefs

Затем, как только вы запустите его, перейдите на вкладку «Одновременный вывод» и установите следующий флажок:

Simultaneous Outputs

Создается новый выход, который нужно выбрать во вкладке «Выход» в настройках PulseAudio, который транслирует звук на каждый выход:

select new output

Это должно сработать.

0
24.04.2020, 15:42
2 ответа

Используйте его, как показано ниже.:(Обратите внимание на все двойные кавычки в аргументах, переданных скрипту.)

#!/usr/bin/bash
first_cmd="$1"
second_cmd="$2"
$first_cmd | $second_cmd > outputfile.txt

Выполнить:

$./temp.sh "ls -lrt" "grep '\.txt$'"

Проверить выход:

$ cat outputfile.txt 
***all the filename with.txt will print
0
19.03.2021, 02:26

Предположим, что пользователь скрипта использует аргумент, который является суффиксом имени файла, с которым он хочет выбирать имена файлов, например .txt.

#!/bin/sh

printf '%s\n'./*"$1"

Это выведет список всех имен в текущем каталоге, которые заканчиваются данным суффиксом имени файла. Команда printfбудет генерировать список, когда оболочка расширяет шаблон (, который включает аргумент, заданный пользователем в конце ), а затем выводит каждую запись списка (имя файла в этом случае )на свою собственную строку в соответствии со строкой формата printf. Здесь используется строка формата %s\n, что означает «некоторая строка, за которой следует символ новой строки».

Хотели бы вы использовать ls -lдля получения «длинного списка», включающего метаданные файла -:

#!/bin/sh

ls -ld./*"$1"

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

Чтобы включить имена в подкаталоги, используйтеbash:

#!/bin/bash

shopt -s globstar
printf '%s\n'./**/*"$1"

Шаблон **рекурсивно сопоставляется с подкаталогами, если он включен с параметром globstar. Вы также можете использовать ls -ldс приведенным выше шаблоном, очевидно, но он может сломаться, если расширение шаблона приведет к многим тысячам имен файлов.

Ограничить список только обычными файлами (, т.е. не именами каталогов и т.п., а включая скрытые имена ), при переходе в подкаталоги:

#!/bin/sh

find. -name "*$1" -type f

Добавьте -lsв конец, если вам нужно что-то похожее на вывод ls -ld.

Это также будет работать, даже если есть много тысяч совпадающих имен файлов, но теперь аргумент больше не может содержать подстановочные символы имени файла (, т. е. приведенная выше команда не будет находить файлы, имена которых заканчиваются чем-то вроде буквальной строки .*. ] если вы укажете '.*'в качестве аргумента скрипта ).

Во всех случаях следует указывать $1. В команде find*также необходимо заключать в кавычки, так как findвыполняет собственное сопоставление с шаблоном, заданным для -name. В других случаях *следует заключать в кавычки, чтобы оболочка могла расширить его.

Перенаправление вывода в файл либо внутри сценария, либо при его запуске, если это является частью требования.

Каждый из вышеперечисленных вариантов скрипта будет вызываться одинаково:

./myscript.sh.txt
1
19.03.2021, 02:26

Теги

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