Я пытаюсь написать простую функцию bash, которая принимает в качестве аргументов несколько файлов и / или каталогов. Должно:
- Полностью уточните имена файлов.
- Сортировать их.
- Удалить дубликаты.
- Распечатайте все, что на самом деле существует.
- Вернуть количество несуществующих файлов.
У меня есть скрипт, который почти делает то, что я хочу, но падает на сортировку. Возвращаемое значение скрипта в его текущем состоянии является правильным, но вывод не является (несортированный и дублирует). Если я раскомментирую | sort -u
оператор, как указано, вывод верен, но возвращаемое значение всегда 0
.
NB. Более простые решения для решения проблемы приветствуются, но вопрос в том, почему это происходит в моем коде. То есть почему добавление канала, по-видимому, останавливает сценарий, увеличивающий переменную r
?
Вот сценарий:
function uniqfile
{
local r=0
for arg in "$@"
do
readlink -e "$arg" || (( ++r ))
done #| sort -u ## remove that comment
return $r
}
for arg in "$@"
доfor arg
. "Если 'в словах ...;' нет, тогда предполагается "в" $ @ "." - помощь дляОтветы:
Это хорошо известная ошибка в bash, благодаря этой функции :
так что измененные переменные являются локальными для подоболочки и не видны ни разу в родительском.
Чтобы избежать этого, перефразируйте ваш код, чтобы избежать конвейера, с подстановкой процесса:
источник
>(..command..)
конструкции? Я думаю, что знаю, как это работает, но чувствую, что мне следует немного почитать.Эти
| sort -u
силы предшествующий бит (так что весь цикл) для запуска в подпроцесс (Баш нужен «STDOUT» для перенаправления вsort
«STDIN». (Интернет , кажется, думаетksh
иbash
обрабатывать этот случай немного по- другому .. первый или последний команда в последовательности конвейера попадает в подоболочку?)В этой теме рассматривается аналогичная проблема, и в конце ее вы найдете аккуратное решение: http://ubuntuforums.org/showthread.php?t=312017.
выдержкаисточник