Где указан путь к оболочке входа в систему для /user/games и т. д.?

Просто сделай:

for f in *.html; do printf '%s\n' "[${f%.*}](./$f)"; done > index.md

Используйте set -o nullglob(zsh,yash)илиshopt -s nullglob(bash)для *.html, чтобы раскрыть ничего вместо*.html(или сообщить об ошибке в zsh), когда нет htmlфайла. С zshвы также можете использовать *.html(N)или в ksh93~(N)*.html.

Или одним printfзвонком сzsh:

files=(*.html)
rootnames=(${files:r})
printf '[%s](./%s)\n' ${basenames:^files} > index.md

Обратите внимание, что в зависимости от используемого синтаксиса уценки вам может потребоваться HTML -кодировать часть title , а URI -кодировать часть URI, если имена файлов содержат некоторые проблемные персонажи. Несоблюдение этого требования может даже привести к появлению формы уязвимости XSS в зависимости от контекста. с кш93,вы можете сделать это с помощью:

for f in *.html; do
  title=${ printf %H "${file%.*}"; }
  title=${title//$'\n'/"
"} uri=${ printf '%#H' "$file"; } uri=${uri//$'\n'/%0A} printf '%s\n' "[$title]($uri)" done > index.md

Где %H¹ определяет кодировку HTML, а %#Hкодировку URI, но нам по-прежнему нужно обращаться к символам новой строки отдельно.

Или сperl:

perl -MURI::Encode=uri_encode -MHTML::Entities -CLSA -le '
  for (<*.html>) {
     $uri = uri_encode("./$_");
     s/\.html\z//;
     $_ = encode_entities $_;
     s:\n:
:g; print "[$_]($uri)" }'

Использование
для символов новой строки. Вместо этого вы можете использовать ␤ или, в более общем случае, выбрать какую-либо форму альтернативного представления для непечатаемых символов -.

В вашем коде есть несколько ошибок:

  • анализ выводаls
  • используйте $как литерал внутри двойных кавычек
  • Использование awkдля чего-то, что grepможет сделать (само по себе не неправильно, но излишне)
  • используйте xargs -0, когда ввод не является NUL -разделителем
  • -Iконфликтует с -L 1. -L 1запускает одну команду на строку ввода, но каждое слово в строке передается как отдельные аргументы, тогда как -I @@запускает одну команду для каждой строки ввода с полной строкой (за вычетом завершающих пробелов и заключением в кавычки. все еще обрабатывается )используется для замены @@.
  • использование {}внутри кода аргументаsh(уязвимость внедрения команд)
  • В shvarв ${var%.*}— это имя переменной , оно не будет работать с произвольным текстом.
  • используйте echoдля произвольных данных.

Если вы хотите использовать xargs -0, вам понадобится что-то вроде:

printf '%s\0' * | grep -z '\.html$' | xargs -r0 sh -c '
  for file do
    printf "%s\n" "[${file%.*}](./$file)"
  done' sh > file.md
  • Замена lsна printf '%s\0' *для получения вывода с разделителями NUL -
  • awkсgrep -z(расширением GNU )для обработки этого вывода с разделителями NUL -
  • xargs -r0(Расширения GNU )без каких-либо -n/ -L/ -I, потому что, пока мы создаем sh, мы могли бы также обработать как можно больше файлов
  • заставить xargsпередать слова в качестве дополнительных аргументов в sh(, которые становятся позиционными параметрами внутри встроенного кода ),не внутри аргумента кода.
  • , что означает, что мы можем более легко хранить их в переменных (здесь с for file do, который по умолчанию перебирает позиционные параметры ), поэтому мы можем использовать оператор раскрытия параметров ${param%pattern}.
  • используйте printfвместо echo.

Само собой разумеется, что нет особого смысла использовать это вместо того, чтобы выполнять этот цикл forнепосредственно над файлами *.html, как в верхнем примере.


¹ Кажется, он не работает должным образом для многобайтовых символов в моей версии ksh93, хотя (ksh93u+ в системе GNU)

0
05.06.2021, 10:45
2 ответа

Если он не установлен в вашей личной среде, он устанавливается для каждого пользователя. Это означает, что где-то под /etc. Перейдите к /etcи введите:

grep usr.games * */* */*/* 2> /dev/null

При установке Ubuntu это даст вам:

environment:PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
login.defs:ENV_PATH     PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
manpath.config:MANPATH_MAP      /usr/games              /usr/share/man
passwd:games:x:5:60:games:/usr/games:/usr/sbin/nologin
passwd-:games:x:5:60:games:/usr/games:/usr/sbin/nologin

Файлы passwdпредназначены для пользовательских игр, поэтому не имеют значения. manpathпредназначен для чтения руководств. Итак, если вы удалите его из environmentи login.defs, ваши игровые -дни закончились.

1
28.07.2021, 11:26

Его можно установить в нескольких местах. Для начала его можно установить одним или несколькими из следующих:

  • любой сценарий профиля оболочки (например. ~/.bashrc, /etc/profile, /etc/bash.bashrc, /etc/profile.d/*и т. д.)
  • /etc/login.defs
  • /etc/security/pam_env.conf
  • /etc/environment
  • $HOME/.pam_environment
1
28.07.2021, 11:26

Теги

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