Как предотвратить дважды выход?

Я просто переустановил, и все работает. Это более ясно.

1
13.03.2013, 23:17
1 ответ

Вы не можете использовать выход из этого пути. Можно использовать кавычки или обратные косые черты для чего-то, что понимает их как парсинг оболочки.

Нет ничего для выхода из разделения слова, сделанного на переменную замену расширения или команды (который отличается от парсинга оболочки (маркирование) командной строки).

То, что можно сделать, любой изменить внутренний разделитель полей $IFS разделить на символах новой строки только (но отметить это кроме с zsh, также необходимо отключить поколение имени файла (хотя не для расширения *.jpg очевидно), который является другой вещью, сделанной на неупомянутую замену команды, если Вы не можете гарантировать, что никакое имя файла не содержит globbing символы):

set -f # disable filename generation
IFS='
' # set IFS  to newline character
IFS=$'\n' # alternative for ksh/zsh/bash
gm convert $(set +f; ls -v ./*.jpg) out.pdf # you also need ./ in case file
                                            # names start with -

(который предполагает, что ни одни из имен файлов не содержат символы новой строки),

set -f в zsh (если в sh/ksh эмуляции), отключает чтение rc файлы (думают zsh -f, csh -f), который не имеет никакого эффекта, после того как оболочка уже запускается, так безопасно.

С zsh, можно сократить это к:

gm convert ${(f)"$(ls -v ./*.jpg)"} out.pdf

(f) короткий для (ps:\n:) должен разделить на символах новой строки.

С другой стороны, Вы могли использовать ls заключение в кавычки для создания командной строки оболочки (окружают код в синтаксисе оболочки, если Вам нравится) передать eval который позволил бы оболочке оценить его и выполнить его:

С ksh93, zsh или bash:

eval "images=($(ls --quoting-style=shell -v ./*.jpg))"
gm convert "${images[@]}" out.pdf

Но с zsh, Вы могли просто сделать:

gm convert ./*.jpg(n) out.pdf

(n) globbing спецификатор, который говорит оболочке сортировать сгенерированные имена файлов численно.

3
27.01.2020, 23:29
  • 1
    Большое спасибо за подробный ответ. (n) функция является потрясающей, слишком плохо это становится настолько сложным в общем случае. Я предполагаю, что генерация целой команды была бы легче получить мою голову вокруг, что-то как echo gm convert `ls -Qv *.jpg` out.pdf и или перенаправьте его в файл или скопируйте и вставьте вывод. –  aditsu 13.03.2013, 09:30
  • 2
    ... или просто передает его по каналу к sh :) –  aditsu 13.03.2013, 09:36
  • 3
    @aditsu, это что оценка для. Но это не работало бы как этот. Выше Вы все еще разделяете вывод ls и echo (как eval сделал бы также), связывает их с одним пространством (вместо того, что вызвало разделение во-первых). Также -Q не стиль заключения в кавычки записи для оболочки (см., например, файлы с $ или ` или новая строка на их имя) и echo разворачивает последовательности обратной косой черты. –  Stéphane Chazelas 13.03.2013, 09:39
  • 4
    Хм это, оказывается, работает в моем случае, но я предполагаю, что это не общее решение. Я нахожу решение для оценки сбивающим с толку из-за "$ {изображения}" часть. –  aditsu 13.03.2013, 09:45
  • 5
    Как действительно устанавливает работу-f? Я попробовал set -f;echo *.jpg и это все еще перечислило все файлы. Или я должен использовать его в сценарии? –  aditsu 13.03.2013, 10:00

Теги

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