Канал присваивает переменную

Да, можно сделать это с /sys файловая система.

/sys поддельная файловая система, динамично сгенерированная ядром и драйверами ядра.
В этом конкретном случае можно перейти в /sys/block/sda и Вы будете видеть каталог для каждого раздела на диске. Существует 2 определенных файла в тех папках, в которых Вы нуждаетесь, start и size. start содержит смещение с начала диска, и size размер раздела. Просто удалите разделы и воссоздайте их с тем же самым, запускается и размеры, как найдено в /sys.

Например, это - то, на что похож мой диск:

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      133119       65536   83  Linux
/dev/sda2   *      133120   134340607    67103744    7  HPFS/NTFS/exFAT
/dev/sda3       134340608   974675967   420167680   8e  Linux LVM
/dev/sda4       974675968   976773167     1048600   82  Linux swap / Solaris

И это - то, в чем я имею /sys/block/sda:

sda1/
 start: 2048
 size: 131072
sda2/
 start: 133120
 size: 134207488
sda3/
 start: 134340608
 size: 840335360
sda4/
 start: 974675968
 size: 2097200


Я протестировал это, чтобы проверить, что информация является достоверной после изменения таблицы разделов в рабочей системе

19
23.04.2015, 17:20
5 ответов
echo cart | { IFS= read -r spo; printf '%s\n' "$spo"; }

Работал бы (сохраните вывод echo без запаздывающего символа новой строки в spo переменная) как долго как echo выводы только одна строка.

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

assign() {
  eval "$1=\$(cat; echo .); $1=\${$1%.}"
}
assign spo < <(echo cart)

Следующие решения работали бы в bash сценарии, но не в bash подсказка:

shopt -s lastpipe
echo cat | assign spo

Или:

shopt -s lastpipe
whatever | IFS= read -rd '' spo

Сохранить вывод whatever до первых символов NUL (bash переменные не могут сохранить символы NUL так или иначе) в $spo.

Или:

shopt -s lastpipe
whatever | readarray -t spo

сохранить вывод whatever в $spo массив (одна строка на элемент массива).

11
27.01.2020, 19:45
  • 1
    не должен там быть пространством между IFS= и read? ответ –  caesarsol 23.04.2015, 16:36
  • 2
    Приветствую последний канал. Также примечание стороны установило +m (ermmm, или-m) необходим из командной строки, которую она как продержится, канал не работает с активным управлением заданиями. ответ Dieguez –  MageProspero 02.10.2015, 06:43

Если Вы просто хотите произвести текущее потоковое использование канала cat.

echo cart | cat 

Если Вы хотите продолжить свою цепочку команды, попытайтесь использовать tee управляйте для повторения вывода.

echo cart | tee /dev/tty | xargs ls

Вы могли использовать псевдоним для сокращения команды.

alias tout='tee /dev/tty'
echo cart | tout | xargs ls
1
27.01.2020, 19:45
  • 1
    Почему Вы хотели бы передать вывод по каналу к плоскости cat? –  roaima 27.01.2015, 00:57
  • 2
    @roaima Some распознает, что они работают на терминале ведение себя по-другому, чем если бы они производят к каналу. В особенности они могут усечь строки на текущий экран width. Для большей части команды команда кошки избыточна. А-ч –  BillThor 27.01.2015, 02:32
  • 3
    хорошо, я вижу теперь, что Вы пытались проиллюстрировать. echo | cat конструкция бросила меня. –  roaima 27.01.2015, 02:35

Вы могли сделать что-то вроде этого, если Вы используете bash:

echo cart | while read spo; do echo $spo; done

К сожалению, переменная "spo" не будет существовать за пределами while-do-done цикла. Если можно получить то, что Вы хотите сделанный в цикле с условием продолжения, который будет работать.

Можно на самом деле сделать почти точно, что Вы записали выше в ATT ksh (не в pdksh или mksh) или в невероятном zsh:

% echo cart | read spo
% echo $spo
cart

Так, другое решение состояло бы в том, чтобы использовать ksh или zsh.

17
27.01.2020, 19:45
  • 1
    Можно использовать, совместно обрабатывает в Shell Korn (например. mksh): echo cart |& while read -p spo; do echo $spo; done (на самом деле лучше для использования while IFS= read -p -r spo; do… хотя) –  mirabilos 27.02.2014, 16:03

Если я правильно понял вопрос, вы хотите передать stdout в переменную. По крайней мере, это то, что я искал и попал сюда. Итак, для тех, кто разделяет мою судьбу:

spa=$(echo cart)

Присваивает cart переменной $spa.

3
27.01.2020, 19:45

Вот мое решение проблемы.

# assign will take last line of stdout and create an environment variable from it
# notes: a.) we avoid functions so that we can write to the current environment
#        b.) aliases don't take arguments, but we write this so that the "argument" appears
#            behind the alias, making it appear as though it is taking one, which in turn
#            becomes an actual argument into the temporary script T2.
# example: echo hello world | assign x && echo %x outputs "hello world"
alias assign="tail -1|tee _T1>/dev/null&&printf \"export \\\$1=\$(cat _T1)\nrm _T*\">_T2&&. _T2"
1
27.01.2020, 19:45

Теги

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