Перемешать случайный список КОМАНД в BASH?

#bash #shell #command-line

#удар #ракушка #командная строка

Вопрос:

У меня есть список команд в текстовом файле с именем commands.txt:

 cat file1.txt | sort gt; file1.txt cat file2.txt | sort gt; file2.txt etc  

Что я хочу сделать, так это рандомизировать этот файл, а затем выполнить каждую строку в случайном порядке. Я попробовал следующее в cmd.sh сценарий оболочки:

 while read -r -a array do  "${array[@]}" done lt; lt;(shuf commands.txt)  

И все, что делает Баш, это кричит на меня, что это синтаксическая ошибка с неожиданным маркером

Это на macOS 10.14 с bash 3.2.57 и zsh 5.8.

Кто-нибудь знает, как это сделать?

Комментарии:

1. Чтение из файла, на который вы перенаправляете вывод, усекает файл. Таким образом, вы в основном просто очищаете все файлы.

2. Вы выполняете свой сценарий, с /bin/sh помощью которого не реализуются замены процессов.

Ответ №1:

Вы можете передавать перетасованные команды в bash без какой-либо обработки:

 shuf commands.txt | bash  

Комментарии:

1. Это отлично работает, спасибо!

Ответ №2:

Каналы ( | ) и перенаправление ( gt; ) не будут работать в переменной. Вы можете использовать eval "${array[@]}" или bash -c "${array[*]}" вместо этого.

Также , если вы это сделаете cat file gt; file , file будет усечен (опустошен) перед cat выполнением. Так что у вас будут только пустые файлы. Вы можете сделать sort file1.txt gt; tmp amp;amp; mv tmp file1.txt