Передача по каналу для вывода цикла предотвращает модификацию локальной переменной

Передача файла через pygmentize-f terminal попытается обнаружить тип от имени файла и выделить его соответственно.

11
15.09.2014, 14:53
2 ответа

Это - известная ловушка удара, из-за этой функции:

Каждая команда в конвейере выполняется как отдельный процесс (т.е. в подоболочке).

так, чтобы измененные переменные были локальны для подоболочки и не видимы однажды назад в родителе.

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

 for arg in "$@"
    do  
        readlink -e "$arg" || (( ++r ))

    done > >(sort -u)
15
27.01.2020, 19:58
  • 1
    .Здорово. Интересно, могли ли Вы сказать мне название >(..command..) создать. Я думаю, что знаю, как это работает, но чувство я должен сделать некоторые дополнительные материалы для чтения. –  tjm 30.09.2011, 12:07
  • 2
    @tjm: это называют заменой –  enzotib 30.09.2011, 12:15
  • 3
    Замена Процесса в Bash имеет много форм: tldp.org/LDP/abs/html/process-sub.html –  slm♦ 15.09.2014, 14:58
  • 4
    Замена Процесса является формой межпроцессного взаимодействия, которое позволяет вводу или выводу команды появляться как файл. Командой заменяют встроенная, где имя файла обычно происходило бы командным процессором. Это позволяет программы, которые обычно только принимают, что файлы непосредственно читают из или пишут в другую программу. –  nobar 20.05.2015, 21:24

| sort -u вызывает предыдущий бит (таким образом, целое для цикла) для выполнения в подпроцессе (удару нужен 'STDOUT' для перенаправления в sort 'STDIN'. (Интернет, кажется, думает ksh и bash обработайте этот случай немного по-другому.. первая или последняя команда в последовательности канала помещается в подоболочку?)

Этот поток пробегается через подобную проблему и имеет аккуратное решение в конце: http://ubuntuforums.org/showthread.php?t=312017

выборка
    #!/bin/bash
    exec 3< <(du | sort -n)  

    n=0
    while read size dir; do
      [ $size -gt 1000 ] && ((n++))
    done <&3
    exec 3<&-

    echo "Found $n too big files"
3
27.01.2020, 19:58

Теги

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