Используя псевдоним в другом сценарии (ksh)

Ответ 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 - Я могу зарегистрировать отчет об ошибках.

2
19.11.2013, 15:17
1 ответ

Не используйте псевдонимы в своих сценариях. Это - плохая идея по точно этой причине. Существуют различные способы работать вокруг этого:

  • Определите псевдоним в рамках самого сценария
  • Получите файл, который содержит псевдоним из сценария. Добавьте эту строку к нему:

    . /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 в машину или в других отношениях стартовый оболочка входа в систему.

1
27.01.2020, 22:22
  • 1
    Вы забыли "обходное решение" относительно использования надлежащих функций :-) "Почти для каждой цели, псевдонимы заменяются функциями оболочки". (от bash руководство). –  Kusalananda♦ 03.02.2018, 16:43
  • 2
    @Kusalananda необходимо было бы все еще получить файл, где функция определяется, таким образом, это не легкое решение также. –  terdon♦ 03.02.2018, 16:49

Теги

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