Оставляя`...`
(или его более новую форму$(...)
)без кавычек, оператор split+glob.
Часть разделения выполняется для символов $IFS
, по умолчанию SPC, TAB и новой строки. Здесь вы хотите разделить только новую строку и не хотите использовать часть glob. Вот так:
IFS='
' # split on newline only. IFS=$'\n' also works in some shells
set -o noglob # disable the glob part
cp -- $(cat test.txt) temp/
С помощью zsh
, который имеет явный оператор расщепления, его можно упростить до:
cp -- ${(f)"$(cat test.txt)"} temp/
С помощью инструментов GNU вы также можете:
xargs -d '\n' -ra test.txt cp -t temp
(который также поможет обойти ограничение на размер аргументов в случае большого количества копируемых файлов ).
Хм.
$ test="test1 test2
> test3 test4
> test5 test6"
$ echo $test
test1 test2 test3 test4 test5 test6
$ echo $(shuf -e $test)
test4 test5 test2 test6 test1 test3
$ echo $(shuf -e $test)
test5 test2 test4 test3 test6 test1
Может быть, случайно так получилось, что "случайно" выбранная для вас перестановка оказалась перестановкой тождества? Вы пробовали несколько раз?