Что означает shuf -e в bash

Оставляя`...`(или его более новую форму$(...))без кавычек, оператор 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

(который также поможет обойти ограничение на размер аргументов в случае большого количества копируемых файлов ).

3
11.09.2019, 20:37
1 ответ

Хм.

$ 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

Может быть, случайно так получилось, что "случайно" выбранная для вас перестановка оказалась перестановкой тождества? Вы пробовали несколько раз?

3
27.01.2020, 21:21

Теги

Похожие вопросы