zsh -Как сделать локальные переменные доступными для внутренних функций, которые не определены с помощью 'eval'?

GNU diff рассматривает файлы как двоичные , если в первых нескольких килобайтах есть нулевой байт. Текстовые файлы не содержат нулевых байтов, а двоичные файлы, скорее всего, будут содержать нулевые байты в пределах первых нескольких сотен байтов, так что это хорошая эвристика. Имя файла не имеет значения.

Причина, по которой diff не отображает различий между двоичными файлами, заключается в том, что обычно это нечитаемо. Двоичные форматы обычно не могут быть разделены на строки, которые обеспечивают полезное перевыравнивание после измененного фрагмента, часто радикально меняются до незначительных семантических изменений (, например, вставка одного символа в сжатый файл может изменить все последующее ), и приведет к непечатаемым символам в выводе diff. Но diff может работать с нулевыми байтами. Чтобы заставить diff обрабатывать файлы как текст (, что означает :для отображения различий ), передайте параметр--text(или-a):

diff --text index.html index3.html

Полезно это или нет, зависит от того, почему файл содержит нулевые байты. Нулевые байты необычны в файле HTML. Вы можете получить подсказку с помощью

file index.html

Если файл на самом деле сжат, diff не покажет ничего полезного :вам нужно распаковать его и дать ему имя, отражающее механизм сжатия, например. index.html.gz. Если у вас есть сжатые файлы, в bash/ksh/zsh вы можете распаковать их на лету (заменить uncompressфактической командой, которая читает сжатый файл из его стандартного ввода и записывает распакованный текст в стандартный вывод):

diff --label=index.html <(uncompress 

Возможно, ваш файл закодирован в кодировке, отличной от -ASCII -, например UTF -16 , UCS -2 , . ] UTF -32 или многобайтовая кодировка до -Unicode. Такие кодировки редко встречаются в сети.Веб-браузеры поддерживают их, но у инструментов для создания документов могут возникнуть проблемы. Если это так, вы избежите головной боли, если измените свою производственную цепочку, чтобы вместо этого использовать UTF -8 . Тем временем diff --textдаст результаты, которые могут быть или не быть читаемыми в зависимости от того, какое содержимое не -ASCII присутствует, или вы можете преобразовать файлы на лету, чтобы передать их в diff, например, с файлами, закодированными в маленький -порядок байтов UTF -16:

diff --label=index.html <(iconv -f UTF-16LE -t UTF-8 

1
18.11.2020, 03:34
1 ответ

В Zsh нет такого понятия, как «внутренняя функция». Ваш outer_funcделает то, что каждый раз, когда он вызывается, он создает обычную функцию inner_func, которая общедоступна (и которая перезапишет любую существующую функцию с именемinner_func). Однако ваш outer_funcна самом деле не вызываетinner_func. Он просто создает его.

Возможно, вы хотите вот что:

outer_func () {
  local LOCAL_VAR='test'
  inner_func
}

inner_func () {
  echo "${LOCAL_VAR}"
}

Затем, когда вы вызываете outer_func, результатом будет то, что inner_funcэхо test.


PS :Вероятно, было бы лучше пере -написать этот код вот так:

outer_func() {
  inner_func 'test'
}

inner_func() {
  print - "$1"
}
1
18.03.2021, 22:49

Теги

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