Ответ Flowbok был правильным решением. Странно, вывод GNU parallel
искажается, если это производится непосредственно в файл - но не, если это переходит к tty.
К счастью, script -c
доступно для имитации tty.
Существует все еще эти три сценария:
#!/bin/bash
# handle_1.sh
while true; do echo "1-$RANDOM$RANDOM$RANDOM$RANDOM"; done
.
#!/bin/bash
# handle_2.sh
while true; do echo "2-$RANDOM$RANDOM$RANDOM$RANDOM"; done
.
#!/bin/bash
# handle_3.sh
while true; do echo "3-$RANDOM$RANDOM$RANDOM$RANDOM"; done
Затем существует файл, который инкапсулирует вызов, чтобы быть параллельным:
#!/bin/bash
# run_parallel.sh
parallel -u -I N ./handle_N.sh ::: "1" "2" "3"
И затем я называю его как это:
script -c ./run_parallel > output
Строки в выводе смешаны линию за линией между выводом различных сценариев, но они не становятся искаженными или чередованными на данной строке.
Причудливое поведение от parallel
- Я могу зарегистрировать отчет об ошибках.
Не используйте псевдонимы в своих сценариях. Это - плохая идея по точно этой причине. Существуют различные способы работать вокруг этого:
Получите файл, который содержит псевдоним из сценария. Добавьте эту строку к нему:
. /home/your_user/.profile
Используйте саму команду вместо псевдонима. Например, если Вы имеете alias foo="echo bar"
, использовать echo bar
в Вашем сценарии вместо foo
.
Как правило это - плохая идея установить псевдонимы в .profile
. Тот файл только читается оболочками входа в систему, не интерактивными и не при запущении скриптов. Для создания псевдонимов легкодоступными, необходимо добавить их к $HOME/.kshrc
. Следующее от man ksh
:
Если оболочка вызывается должностным лицом (2), и первый символ нуля аргумента (0$) - то оболочка, как предполагается, является оболочкой входа в систему, и команды читаются из/etc/profile и затем или от .profile в текущем каталоге или от $HOME/.profile, если любой файл существует. Затем, для интерактивных оболочек, команды читаются из файла, названного путем выполнения расширения параметра, управляют заменой и арифметической заменой относительно значения ENV переменной среды, если файл существует.
Другими словами, войдите в чтение оболочек /etc/profile
и .profile
в то время как интерактивные оболочки (что Вы получаете при открытии терминала) читают то, что находится в $ENV
переменная или, если это не определяется, ~/.kshrc
. Это означает что псевдонимы в Вашем .profile
будет только считан когда sshing в машину или в других отношениях стартовый оболочка входа в систему.
bash
руководство). – Kusalananda♦ 03.02.2018, 16:43