Объединение нескольких обрабатывает замену

Чистка nagios3. Затем переустановите. Это будет, вероятно, работать.

apt-get purge nagios3
apt-get install nagios3

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

6
23.04.2013, 09:52
2 ответа

Вы могли сделать:

eval paste '<(sort -n ../data/file-'{A,B,C}'.dat)'

Или автоматизировать его как функцию

sort_paste() {
  local n i cmd
  n=1 cmd=paste
  for i do
    cmd="$cmd <(sort -n -- \"\${$n}\")"
    n=$(($n + 1))
  done
  eval "$cmd"
}
sort_paste  ../data/file-{A,B,C}.dat

(в некоторых ksh реализации, необходимо заменить local с typeset)

Адаптироваться к любой произвольной команде, (и доказать это eval может быть безопасным при надлежащем использовании) Вы могли сделать:

xproc() {
  local n i cmd stage stage1 stage2 stage3
  cmd= xcmd= stage=1 n=1
  stage1='cmd="$cmd \"\${$n}\""'
  stage2='xcmd="$xcmd \"\${$n}\""'
  stage3='cmd="$cmd <($xcmd \"\${$n}\")"'
  for i do
    if [ -z "$i" ] && [ "$stage" -le 3 ]; then
      stage=$(($stage + 1))
    else
      eval 'eval "$stage'"$stage\""
    fi
    n=$(($n + 1))
  done
  eval "$cmd"
}

xproc paste '' sort -n -- '' ../data/file-{A,B,C}/dat
2
27.01.2020, 20:30
  • 1
    мне не нравится eval, но я вижу, что аргументы надежно обрабатываются выше. Единственное беспокойство, которое я вижу, является обработкой $cmd: это пройдет обычные расширения. Это прекрасно когда cmd прикреплен к paste, но это может быть проблематично, когда Вы хотите обобщить это и принять cmd из командной строки, как в local i n=1 cmd="$1"; shift; .... –  musiphil 23.04.2013, 22:02
  • 2
    +1 для надлежащей оценки. Ваша первая версия прекрасна абсолютно (и самое чистое и самое легкое для поддержания) с тех пор в этом сценарии, Вы имеете полный контроль над строкой, переданной оценке –  Clayton Stanley 24.04.2013, 10:27

Посмотрите здесь, почему eval может быть опасно для использования. Как Вы заметите, это - очень мощный инструмент, но в то же время может нанести большой ущерб.

Следующий сценарий сделает то, что Вы хотите - безопасно.

sort_ps () 
{ 
    local cmd="$1" p=()
    shift;
    for f in "$@"; do
        p+=(<(sort -n "$f"));
    done
    "$cmd" "${p[@]}"
}

Править: Г-н Chazelas прав. Я зафиксировал свое решение, таким образом, можно теперь использовать sort_ps paste file1.txt file2.txt file2.txt ... fileN.txt вместо этого. Спасибо Stephane для рассмотрения моего ответа.

Демонстрационный вывод:

rany$ sort_ps sprunge foo1.txt foo.txt 
http://sprunge.us/EBZf?/dev/fd/62
http://sprunge.us/TQGC?/dev/fd/62
1
27.01.2020, 20:30
  • 1
    eval опасно, когда передано неконтролируемые данные, которые не имеют место в решении, которое я дал. Вы забыли "-" и a""; Вы не сообщаете об ошибках вставки как статус выхода. Вы не объясняете a $temp_dir потенциально существующий в среде. Это перестанет работать, если какой-либо аргумент будет содержать наклонные черты (как в вопросе OP), Вы не вставляете в порядке, который были даны файлы, Вы не используете замену процесса в качестве OP, который требуют: использует дополнительное временное пространство, виды, выполненные последовательно вместо одновременно, никакая очистка на SIGKILL. –  Stéphane Chazelas 23.04.2013, 18:36
  • 2
    я не ожидал, что замены процесса выживут до конца где "$cmd" на самом деле выполняется, не прямо после каждого оператора. Когда sort_ps реализован как функция оболочки как выше, sort_ps echo ../data/file-{A,B,C}.dat дает /dev/fd/63 /dev/fd/62 /dev/fd/61, указание они выживают до конца действительно. Однако, когда sort_ps реализован как сценарий оболочки, он дает /dev/fd/63 /dev/fd/63 /dev/fd/63, что означает, что каждая замена процесса завершается прямо после того, как она упоминается. Как странный! Я не могу найти официальную документацию об этом. –  musiphil 23.04.2013, 22:48
  • 3
    Странный, но это, кажется, функция, представленная в ударе 2,04 –  Stéphane Chazelas 24.04.2013, 10:13
  • 4
    Вы все еще отсутствуете "-". Попытайтесь выполнить его на файле, названном passwd в каталоге, названном "-o/etc", например. –  Stéphane Chazelas 24.04.2013, 13:11
  • 5
    На ударе 4.3.11 (1) - выпускает на x86_64-pc-linux-gnu, даже метод функции оболочки дает /dev/fd/63 /dev/fd/63 /dev/fd/63, подразумевать, что замены процесса не выживают до последней команды. Так хранение замен процесса в массиве не работает. –  musiphil 15.12.2017, 22:58

Теги

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