Проблема с примером кода в вопросе очень тонкая; для записи в именованную трубу вам нужно &
фонировать команду, иначе она будет блокироваться в ожидании чтения. Однако когда вы это сделаете, "команды, запущенные в фоне с &
, перенаправят свой стандартный ввод [на] /dev/null
. ", то есть /dev/null
- это то, что передается в p
, а не в stdin.
В Bash обходной путь прост: перенаправьте stdin в фоновый процесс с помощью 0. Тогда пример будет работать правильно:
$ echo foo | { mkfifo p; cat 0<&0 > p & cat < p; rm p; }
foo
Полная функция compose
в итоге выглядит так:
compose() {
dir=$(mktemp -d) # Create a temp dir to hold the pipes
cd $dir # to avoid filename conflicts
i=0 #
mkfifo "pipe$i" # Create pipe0, the output for command $1
($1 0<&0 > "pipe$i" &) # Start $1, reading stdin and writing to pipe0
shift # Shift off $1 since it's running
for c in "$@"; do # Loop over the remaining commands
ii=$((i+1)) #
mkfifo "pipe$ii" # Create a pipe i+1, the next command's output
($c < "pipe$i" > "pipe$ii" &) # Start the next command, reading from the
i=$ii # i'th pipe and writing to the i+1'th
done #
cat "pipe$i" # Output the last pipe, executing the commands
cd - > /dev/null # Change back to the old directory
rm -rf $dir # Remove all the pipes
}
Если у вас есть или вы можете установить расширение PERL,rename
(apt-get install rename
в дистрибутиве на основе Debian -)...
find ~ -type f -name "*.hhs" -exec rename -d ".hhs" {} +
Опция -d
или --delete
удаляет указанную строку.
Требуется инструмент, который может удалить суффикс имени файла .hhs
из имени файла. find
не может сделать это за вас, поэтому вам придется вызывать другую утилиту через-exec
:
find "$HOME" -type f -name '*.hhs' -exec sh -c '
for pathname do
cp -i "$pathname" "${pathname%.hhs}"
done' sh {} +
Я не использую здесь basename
, так как это также удалит путь к каталогу из найденных путей (, которые можно снова вставить с помощью dirname
, но это приведет к беспорядку в коде ).
Вместо этого я вызываю внутристрочный -сценарий оболочки с максимально возможным количеством найденных путей и позволяю сценарию перебирать их, копируя отдельные файлы. Новое имя создается с использованием стандартной подстановки параметров, которая удаляет строку .hhs
из конца значения $pathname
.
Связанные: