сценарий, чтобы использовать вывод команды (ls) и использовать его в другой команде

Не согласно странице справочника, которая только вызывает attach -r опция включить режим только для чтения.

Кроме того, в исходном коде, только следующая строка в cmd-attach-session.c устанавливает флаг только для чтения. Остальная часть кода проверяет, установлен ли этот флаг, но не изменяет свое значение. Таким образом, снова похоже, что Вам не повезло, если Вы не можете внести (или запрос) изменение кода:

    if (cmd_check_flag(data->chflags, 'r'))
        ctx->cmdclient->flags |= CLIENT_READONLY;

5
10.06.2011, 02:53
3 ответа

Я подробно остановлюсь на ответе jasonwryan, который объясняет какой, но не как или почему.

Можно использовать вывод команды как аргументы другой команде. Это называют заменой команды.

some_text='Hello, world'
uppercased="$(echo "$some_text" | tr a-z A-Z)"
echo "Now, it's $uppercased"

Однако $(ls …) ужасно по двум причинам:

  • Не анализируйте вывод ls. Это не разработано, чтобы быть parsable.
  • "$(some-command)" дает Вам строку, которая является выводом той команды. Если у Вас есть команда, которая возвращает список элементов, необходимо проанализировать ту строку в отдельные элементы. Это трудно и ненадежно, если Вы не можете найти простой разделитель. Для имен файлов Вы не можете легко найти разделитель, потому что имена файлов на большинстве нельдов могут содержать каждый символ ⁰.

Обратите внимание на это, если Вы пишете $(some-command) вместо "$(some-command)", вывод команды разделяется на слова и подвергается globbing. Пока Вы не понимаете предыдущее предложение, всегда помещаете двойные кавычки вокруг замен команды. Когда Вы действительно понимаете, всегда помещаете двойные кавычки, если Вы не знаете, почему Вы не можете поместить их.

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

echo *.pdf

Для действия на несколько файлов Вы используете цикл.

for x in *.pdf; do …; done

Остающееся препятствие должно генерировать название конечного файла. Оболочка имеет некоторые простые текстовые команды управления, среди который ${foo%SUFFIX} получить значение переменной с удаленным суффиксом. (Существует также ${foo#PREFIX}.)

for x in *.pdf; do
  ebook-convert "$x" "${x%.pdf}.epub"
done

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

Кроме нулевого символа, но большинства оболочек не может справиться с ними.

9
27.01.2020, 20:31
  • 1
    Спасибо за фиксацию суффиксной части моего сценария. Я не был уверен, было ли необходимо, т.е., если преобразовывают электронная книга управляемый та замена; но Ваш подход и более полон и более безопасен. –  jasonwryan 10.06.2011, 03:44
  • 2
    Спасибо! Не только сделал Вы "показываете мне путь", Вы также предоставили мне хорошее понимание сценариев оболочки. И ответили на мой вопрос "новичка". Еще раз спасибо. спасибо –  alburnett 10.06.2011, 05:12

Это могло бы быть более простым подходом:

for file in *.pdf; do
    ebook-convert "$file" "${file%.pdf}.epub"
done
exit 0
7
27.01.2020, 20:31
  • 1
    я думаю, что он почти работал бы. Похож я забыл добавлять корректный и полный синтаксис команды. преобразуйте электронная книга file.pdf file.epub, Это использует расширения файла, чтобы выяснить, как преобразовать файлы. Извините за то, чтобы не быть ясным. –  alburnett 10.06.2011, 00:52
  • 2
    я обновил сценарий: дайте этому движение... –  jasonwryan 10.06.2011, 01:39
  • 3
    @jasonwray также. Я действительно ценю справку. –  alburnett 10.06.2011, 05:13

Ответ остроты с небольшим преимуществом, которое преобразование выполняет параллельно:

parallel ebook-convert {} {.}.epub ::: *.pdf

Я приехал приученный к не использованию для циклов в оболочке больше. Они все аккуратно заменимы Параллелью GNU.

3
27.01.2020, 20:31

Теги

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