Трактовка входа для команды чтения как самой команды

Я только что протестировал на vm с centos 6.7:

# parted /dev/sdb 
GNU Parted 2.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Error: /dev/sdb: unrecognised disk label                                  
(parted) mklabel gpt                                                      
(parted) mkpart primary 1m 100%
(parted) quit                                                             
Information: You may need to update /etc/fstab.                           

[root@localhost ~]# parted /dev/sdb print 
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  1073MB  1072MB               primary

[root@localhost ~]# parted /dev/sdb "unit s print"
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 2097152s
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start  End       Size      File system  Name     Flags
 1      2048s  2095103s  2093056s               primary

и вот, пожалуйста, правильно выровненный gpt-раздел.

1
23.08.2018, 10:42
3 ответа

Если вы хотите, чтобы сообщение читалось как одна строка из стандартного ввода (, введенная пользователем при использовании сценария в терминале )и затем переданная в качестве аргумента функции, вы можете:

fct1 "$(line)"

lineбольше не является стандартной командой, но все еще довольно широко распространена. Вы можете заменить его на head -n1, но в некоторых реализациях он может считывать более одной строки (, хотя выводит только одну ), когда ввод не поступает с терминального устройства.

С bash's readвам придется сохранить его в переменной. Вот для чего read— хранить ввод в переменной.

IFS= read -r line && fct1 "$line"

С zshдля readвы можете использовать опцию -e, которая отображает прочитанные данные вместо сохранения их в переменной, поэтому lineвыше может быть записано какIFS= read -re:

fct1 "$(IFS= read -re)"

(это менее эффективно, чем использование readс переменной, поскольку нам нужно разветвить процесс, чтобы zsh мог прочитать вывод read).

Конечно, вы также можете заменить свой:

local msg1=${@}

с

local msg1; IFS= read -r msg1 || return
2
27.01.2020, 23:31

Утилита readне позволяет использовать обратные вызовы (Я не уверен, что какие-либо распространенные инструменты Unix позволяют ). Кроме того, она не выводит прочитанные данные.

Что вам нужно сделать, так это обернуть вызов readфункцией, которая принимает то, что предоставляет пользователь, и выводит его обратно, как вы описываете. В качестве альтернативы используйте какой-либо другой инструмент для чтения ввода и получения желаемого результата, например awk.

Кроме того, в общем случае использование variable=$@не совсем точно определено. Если вы хотите, чтобы аргументы командной строки представляли собой список значений, разделенных пробелами -, используйте variable="$*"вместо (, предполагая значение по умолчанию для переменной IFS).

0
27.01.2020, 23:31

Это довольно необычный запрос... хммм... чтобы получить некоторый ввод от терминала в список позиционных параметров этой функции, попробуйте

fct1 "$(cat)"
dfergerg
I say dfergerg
i repeat
I saaaaaaaaay dfergerg

Это будет продолжаться catдо тех пор, пока вы не введете символ EOF (CTRL -D ). Убедитесь, что переменная vertустановлена ​​на truвне функции.

0
27.01.2020, 23:31

Теги

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