Из справочной страницы perlrun
:
perl... [ [-e|-E] 'command' ]...
Все, что следует за параметром -e
, perl обрабатывает как команду. С -nel
, l
является командой для -e
. print $1 if /install\(TARGETS (.*) RUNTIME DESTINATION bin\)/
является первым аргументом опции, отличной от -, и он становится входным файлом, который perl пытается открыть и терпит неудачу.
Сравните, скажем, с:
~ echo foo | perl -neprint
foo
zsh
:zmodload zsh/datetime
strftime -s date %F $EPOCHSECONDS
set -o emacs
vared -p 'What date would you like? ' date
(
или используя подсказку с помощьюprint -P
:
print -rPv date '%D{%F}'
set -o emacs
vared -p 'What date would you like? ' date
или (другой (и более старый )способ получить быстрое расширение):
date=${(%):-%D{%F}}
set -o emacs
vared -p 'What date would you like? ' date
)
vared
— это встроенная команда ed
для var
.
fish
:fish_default_key_bindings
read -c (date +%F) -P 'What date would you like? ' date
ksh93
:date=${ printf '%(%F)T' now; }
set -o emacs
IFS= read -rv 'date?What date would you like? '
bash
:printf -v date '%(%F)T' -1
set -o emacs
IFS= read -rei "$date" -p 'What date would you like? ' date
All предварительно -заполнит строковый редактор текущей датой и позволит вам редактировать ее (с привязкой клавиш в стиле emacs -; замените emacs
/ default
на vi
, если вы предпочитаете стиль vi
).
Здесь %F
(, сокращение от %Y-%m-%d
), является стандартной директивой strftime()
, которая дает вам дату в международном формате YYYY-MM-DD
. Вы можете адаптироваться к вашим потребностям. Подробности смотрите на справочной странице strftime(3)
.
Обратите внимание, что только подходы zsh
и fish
работают правильно, если вы хотите отредактировать многострочную переменную -.
Вы не указали, какую оболочку используете. Если вы используете Bash, в read
это встроено.
read -ei "$( date +%F )" -p 'What date would you like? ' USER_DATE
echo "You chose ${USER_DATE}"
Пояснение:
-e Use readline for input.
-i Specify how to pre-fill the buffer.
-p Provide a prompt to the user.
Конечно, вам придется включить проверку на ошибку -, чтобы убедиться, что пользователь ввел правильную дату, хотя вы можете использовать date
саму по себе, потому что она очень гибкая. Будьте осторожны с вашим языком, потому что «03 -01 -2021» означает в Америке нечто иное (1 марта 2021 ), чем в остальном мире (3 января 2021 ). Использование формата ГГГГ -ММ -ДД, вероятно, будет работать во всем мире.
В качестве альтернативы, если вы предпочитаете графический интерфейс, вы можете использовать что-то вроде Zenity или Yad, которые могут быть встроены в вашу систему или доступны в ваших стандартных репозиториях (они также доступны в виде моментальных снимков ).
Чтобы использовать Zenity, вы можете сделать что-то вроде следующего (это показывает синтаксис Bash):
function findUserDate
{
declare -gr USER_DATE="$(
zenity --entry --title='Date query' --text='What date would you like?' --entry-text="$( date +%F )"
)"
[[ -z ${USER_DATE} ]] && exit 2
echo "You chose ${USER_DATE}"
}
Как насчет этого:
read -p "What date would you like (Press enter for today)? " user_date
date="${user_date:-$(date +%Y%m%d)}"
echo "Chosen date is: $date"
Фактический формат даты(%Y%m%d
)зависит от вас.