Предполагая, что ваш план резервного копирования состоит в том, чтобы предоставить список файлов на стандартном вводе, по одному на строку, а ваш основной план - предоставить список файлов в командной строке, по одному на аргумент:
#!/bin/bash
declare -a files # let's use an array to avoid whitespace tokenization
let filecnt=0
if [ "$#" -gt 0 ]; then
# we have args!
for f in "$@"; do
files[$filecnt]="$f"
((filecnt++))
done
else
# we have filenames on stdin!
while read -e line; do
files[$filecnt]="$line"
((filecnt++))
done
fi
# now do whatever you need to do with the filenames
for filename in "${files[@]}"; do
echo "$filename"
done
Как обычно в Unix, Ctrl-D в отдельной строке завершает стандартный ввод и позволяет программе продолжаться.
Но вы упомянули «падение», что заставляет меня думать, что вы действительно like - возможность перетаскивания. Для этого, утконос может быть что-то посмотреть. Я верю, что он объединит ваш сценарий в приложение, которое сделает для вас цель перетаскивания и передаст удаленные файлы в качестве аргументов вашему сценарию.
Обновить : Если вы хотите, чтобы файлы содержали только один старый пробел между ними, чтобы в одной строке могли находиться несколько файлов, замените этот цикл while на:
while read -ea lfiles; do
for f in "${lfiles[@]}"; do
files[$filecnt]=$f
((filecnt++))
done
done
Или, если вы ожидаете только одну строку со всеми файлами на нем, вы можете упростить весь цикл while:
read -ea files
Имейте в виду, однако, что с этим подходом вы должен введите обратную косую черту перед любым пробелом, который вы на самом деле хотите включить в путь к файлу или каталогу, или сценарий проанализирует ваш путь как несколько отдельных файлов! (Перетаскивание из Finder в Терминал автоматически выполнит эту обратную косую черту за вас.)
readвариант? Важно иметь возможность читать несколько файлов / каталогов, иначе это будет регрессия.