fi sh: несколько команд в одной строке - PullRequest
0 голосов
/ 03 августа 2020

Следующие команды (fi sh версия 2.7.1) работают безупречно, когда я запускаю их в командной строке одну за другой

converter_to_csv *.ods
cat *.csv >> data.csv

Но когда я пытался объединить их в одну строку

converter_to_csv *.ods; and cat *.csv >> data.csv

Они закончили с ошибкой:

fish: No matches for wildcard “*.csv”. See `help expand`.

Я читал главы о подстановках и подстановочных знаках, но не смог найти четкого объяснения, как с этим бороться.

Я также попытался поместить эти команды в файл сценария

#!/usr/bin/fish
converter_to_csv *.ods
cat *.csv >> data.csv

, который вызывает ту же ошибку.

Что я делаю неправильно?

1 Ответ

1 голос
/ 04 августа 2020

Этот абзац в help expand уместен здесь:

Обратите внимание, что для большинства команд, если какой-либо подстановочный знак не раскрывается, команда не выполняется, $ status устанавливается в ненулевое значение и предупреждение печатается. Такое поведение согласуется с настройкой shopt -s failglob в bash. Есть ровно 4 исключения, а именно set , переопределение переменных в переопределяет , count и для . Их глобусы могут расширяться до нуля аргументов, как с shopt -s nullglob в bash.

Таким образом, вы можете:

#!/usr/bin/fish
converter_to_csv *.ods
set result $status

set csvfiles *.csv
if test (count $csvfiles) -eq 0
    echo "No CSV files produced" >&2
    exit $result
else
    cat $csvfiles >> data.csv
end
...