the shell will read from the script file or from a device descriptor
Или из конвейера, что, вероятно, является самым простым способом получить ввод fd без -поиска.
Should the shell also read one character at a time from its script input?.
Если он хочет поддерживать сценарии, запускающие команды, считывающие данные со стандартного ввода, и ожидающие получения ввода с использованием строк из самого сценария.
Как-то так:
$ cat foo.sh
#!/bin/sh
line | sed -e 's/^/* /'
xxx
echo "end."
$ cat foo.sh | bash
* xxx
end.
Команда line
читает одну строку из стандартного ввода (строку xxx
), а оболочка читает остальные строки как команды. Чтобы это работало, line
также нужно позаботиться о том, чтобы не читать ввод слишком далеко, иначе оболочка не увидит следующие строки. С утилитами GNU head -n1
будет читаться слишком много, например. sed
. Утилита line
из util -linux заботится о том, чтобы читать по одному байту за раз, чтобы не читать дальше новой строки.
Приведенный выше скрипт не работает, например, с. dash
, так как скрипт считывает полные блоки за раз:
$ cat foo.sh | dash
*
dash: 3: xxx: not found
end.
Dash и Busybox читали полные блоки, другие, которые я тестировал, (Bash, Ksh, mksh
и Zsh )считывали байт -на -байт.
Обратите внимание, что это довольно запутанный сценарий, и он не работает должным образом, если выполняется, например, как. bash foo.sh
, так как в этом случае stdin
не указывает на сам скрипт, и строка xxx
воспринималась бы как команда. Вероятно, было бы лучше использовать документ здесь -, если вы хотите включить данные в сам скрипт. Это работает с любой оболочкой, при запуске как sh bar.sh
,sh < bar.sh
илиcat bar.sh | sh
:
$ cat bar.sh
#!/bin/sh
sed -e 's/^/* /' <<EOF
xxx
EOF
echo "end."
После некоторых экспериментов я определил, что KDE neon учитывает настройки локали в /etc/default/locale
, но игнорирует настройки локали в /etc/locale.conf
. Я до сих пор не понимаю, почему Ubuntu использует другое место для файла локали, но я пришел к выводу, что в дистрибутивах на основе Ubuntu необходимо использовать /etc/default/locale
для установки локали. Кроме того, я только что заменил /etc/default/locale
на симлинк на /etc/locale.conf
, и все работает нормально, но теперь у меня есть только один файл с настройками локали.
Различные дистрибутивы или версии Linux используют то или иное. В качестве примера, документация для Debian 10 ссылается в основном на /etc/default/locale
(, например.man update-locale
). Его части, связанные с systemd -, также относятся к /etc/locale.conf
(, например.man locale.conf
).
Краткий тест показывает, чтоlocalectl
(также часть systemd Debian 10 )сообщает содержимое /etc/default/locale
как локаль системы, если /etc/locale.conf
также не существует :, в этом случае, очевидно, она имеет приоритет.
Я снова использую /etc/default/locale
исключительно (в текущей версии Debian ). Я рассуждаю следующим образом :этот вариант может подойти для Debian, любой из них подходит для системы, так что в целом это очевидный выбор.