Печать/Мишень к консоли, не передавая вывод для передачи по каналу

если Вы хотите скопировать корневую файловую систему и беспокойство о специальных файлах и устройствах, лучший способ:

  • сначала для монтирования / в subdir использование связывать опции для монтирования этот путь Вы не должны будете волноваться о/proc,/dev,/sys и других смонтированных файловых системах
  • затем используйте команду, которая знает, как обработать специальные файлы, как CP-a или rsync-a

позволяет говорят, что Вы смонтировали внешний диск под/mnt/external

mkdir /mnt/root
mount / /mnt/root -o bind
cp -a /mnt/root/* /mnt/external/

или

rsync -aP /mnt/root/ /mnt/external/

или (если Вам нравится tar так, btw худшая опция),

tar -C /mnt/root -cf - ./ | tar -C /mnt/external -xpf -

добавьте-v к любому вышеупомянутому для подробного вывода, но это замедлит немного процесс

1
05.11.2012, 21:46
2 ответа

Я не знаю ни о какой стандартной команде с этой целью, но достаточно легко разработать одно собственное в небольшом сценарии оболочки. Создайте следующее, сделайте это исполняемым файлом и добавьте его местоположение к своему ПУТИ.

Редактирование - обновленный, чтобы обработать многострочный стандартный вход и обработать пробелы во входе.

printOrWhatnot:

 #!/bin/bash
 # printOrWhatnot script, to re-pipe stdin, while echoing something else via stderr

 # read stdin (possibly multi-lined) into $my_array[]:
 while read -t 1  piped
 do
    my_array=("${my_array[@]}" "$piped")
 done

 # echo the supplied arguments by sending them to stderr:
 echo "$@" 1>&2

 # now spew $my_array[], line by line, to any further processing:
 arrayLen=${#my_array[@]}
 for (( i=0; i<$arrayLen; i++ ));
 do
    echo ${my_array[$i]}
 done

Теперь это должно работать, как Вы предположили:

 myhost> echo dog | printOrWhatnot "PUTTING MY THING DOWN" | sed 's/dog/cat/g' | printOrWhatnot "FLIP IT"|rev
 PUTTING MY THING DOWN
 FLIP IT
 tac
2
27.01.2020, 23:21
  • 1
    Извините за спам комментария. Я думаю, что узнал свою проблему все же. Я добавил другой пример в вопросе. –  Chris 05.11.2012, 21:37
  • 2
    Ну, это действительно добавляет слой сложности. Это может все еще быть выполнено со сценарием оболочки путем чтения в массив - обновляющий ответ. –  Lars Rohrbach 05.11.2012, 22:21
  • 3
    Это в значительной степени, с чем я закончил тем, что шел. Я получил то же самое для обработки пробелов путем обертывания массива в кавычки когда то, что это было считанным.Спасибо! –  Chris 06.11.2012, 22:34

Необходимо отправить сообщение в другой дескриптор файла, чем stdout и просто вывести stdin к нетронутому stdout:

printOrWhatnot() { echo "$@" >&2; cat -; }

Если Вам нужны Ваши сообщения, чтобы (в конечном счете) появиться на stdout, изменении rev кому: rev 2>&1 или перенесите свой конвейер в фигурные скобки:

{
    echo dog | 
    printOrWhatnot "PUTTING MY THING DOWN" | 
    sed 's/dog/cat/g' | 
    printOrWhatnot "FLIP IT" |
    rev
} 2>&1 
2
27.01.2020, 23:21
  • 1
    Этот метод требует, чтобы Ваша оболочка была вариантом Оболочки Bourne (нет csh или tcsh например), и что stdin не пуст. Но это приятно компактно. –  Lars Rohrbach 31.10.2012, 03:11
  • 2
    @LarsRohrbach, здесь "отзываются эхом, собака" делает задание создания данных для stdin. –  glenn jackman 31.10.2012, 12:55
  • 3
    Хорошо, конечно, это в этом случае. Я просто говорю об использовании printOrWhatnot в целом. –  Lars Rohrbach 31.10.2012, 16:36

Теги

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