Да, можно сделать это с /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
Я протестировал это, чтобы проверить, что информация является достоверной после изменения таблицы разделов в рабочей системе
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
массив (одна строка на элемент массива).
Если Вы просто хотите произвести текущее потоковое использование канала cat
.
echo cart | cat
Если Вы хотите продолжить свою цепочку команды, попытайтесь использовать tee
управляйте для повторения вывода.
echo cart | tee /dev/tty | xargs ls
Вы могли использовать псевдоним для сокращения команды.
alias tout='tee /dev/tty'
echo cart | tout | xargs ls
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.
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
.
Вот мое решение проблемы.
# 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"
IFS=
иread
? ответ – caesarsol 23.04.2015, 16:36