скопируйте использованный вывод в stdout, когда stdout будет перенаправлен в файл

Принятие Вас уже имеет отдельный раздел (и если Вы не делаете, Вы, вероятно, хотите использовать gparted или что-то подобное, сделать одно), Вы просто делаете следующее (предпочтительно как пользователь root):

 cp -R /home/whatever /path/to/destination
 mv /home/whatever /home/whatever.orig
 ln -s /path/to/destionation /home/whatever 

И затем предположение, что все работает способ, которым это должно (входят в систему как пользователь и тест),

 rm -rf /home/whatever.orig 

Это копирует весь каталог (и все содержание) к целевой точке монтирования, переименовывает исходный корневой каталог (в случае, если что-то завинчено в процессе, затем мы можем восстановиться), создает символьную ссылку от нового местоположения до исходного корневого каталога (на который все (как/etc/passwd) все еще указывает), затем предполагая, что это работало, удаляет резервную копию, которую мы сделали, оставив копию, которую мы помещаем в целевую файловую систему.

6
29.08.2011, 20:21
5 ответов

tee stdout поток к оконечному устройству управления /dev/tty.

(
exec 1> >(tee -a stdout.log)
: > stdout.log
#var="$(echo -e "one\ntwo" | tee /dev/tty | grep one)"
var="$(echo -e "one\ntwo" | tee -a /dev/tty stdout.log | grep one)"
echo "var=$var"
)

cat stdout.log
# one
# two
# var=one
1
27.01.2020, 20:30
  • 1
    Используя tty отличная идея, но к сожалению я хочу, чтобы данные закончились в файле журнала, не на консоли. –  ajorg 29.08.2011, 20:31

Я не ясен, хотите ли Вы $var, или $var просто средство для конца. Для получения $var добавить var="$(cat log)"

sed -nre 'p;/one/w log' <(echo -e "one\ntwo")
  • -------(stdout)
    один
    два
  • -------(журнал)
    один

Или сделайте Вы имеете в виду что-то вроде этого:

sed -nre 'p;/one/w log' -e 's/one/logged: &/p' <(echo -e "one\ntwo")
  • -------(stdout)
    один
    зарегистрированный: один
    два
  • -------(журнал)
    один

Примечание: sed's w перезаписи команды log каждый раз сценарий выполняется. Можно, конечно, добавить log к основному журналу после sed выполнения. См.: Управляйте Сводкой для sed

1
27.01.2020, 20:30

Почему не только используют функцию:

#!/bin/bash
logAndEcho () {
    echo -e "$@" >> LOGFILE.txt
    echo -e "$@"
}
var=$(logAndEcho "one\ntwo\nThis is a test"|grep one)
echo "var=$var"

Это отправит все результаты в файл журнала и затем повторит данные к stdin, где можно получить его, как Вам нужно.

0
27.01.2020, 20:30

Я думаю, что необходимо использовать дополнительный дескриптор файла и tee stdout поток к нему так, чтобы дублированный stdout поток может быть перенаправлен к файлу журнала. Этот путь нормальное stdout поток через /proc/$$/fd/1 оставлен без изменений. И если grep сбои для соответствия строке у Вас должен быть весь вывод команды что grep, использованный доступный в Вашем файле журнала для отладки целей.

useful="$(
exec 3<&1 3>stdout.log
curl -s http://example.com/some/data | tee /proc/$$/fd/3 | grep 'useful line'
exec 3<&-
)"
echo "useful=$useful"


# test case
(
# dup stdout using tee & an additional file descriptor
# open fd 3 for reading from where fd 1 is pointing to (i.e. stdout)
# anything that is being redirected to fd 3 will be redirected to stdout.log 
#exec 3<&1 3>stdout.log
exec 3<&1 3> >(tr '[:lower:]' '[:upper:]' > stdout.log)
echo -e "one\ntwo" | tee /dev/fd/3 | grep one        # Mac OS X
#echo -e "one\ntwo" | tee /proc/$$/fd/3 | grep one   # Linux
exec 3<&-
) 

Другой подход мог бы быть должен использовать именованные каналы, или Bash Совместно обрабатывает (доступный в Bash 4.0 и выше).

Для получения дополнительной информации о дескрипторах файлов см.: Дескриптор файла 101

0
27.01.2020, 20:30
[1122846] sed предназначен для этого - это редактор потока. Он может заменить тройник и grep в вашем процессе, или, при желании, быть скомбинирован с тройником для еще нескольких тройников в вашей вилке. В любом случае, убедитесь сами:

0
27.01.2020, 20:30

Теги

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