почему нельзя экспортировать `_` в среду bash?

Если вы вызываете

i=`cat input`

, это позволяет вашему процессу оболочки увеличиваться на 50 МБ до 200 МБ (в зависимости от внутренней реализации широких символов). Это может замедлить работу вашей оболочки, но это не главная проблема.

Основная проблема заключается в том, что приведенной выше команде необходимо прочитать весь файл в память оболочки, а echo $ i необходимо выполнить разделение полей для содержимого этого файла в $ i . Чтобы выполнить разделение полей, весь текст из файла необходимо преобразовать в широкие символы, и именно на это тратится большая часть времени.

Я провел несколько тестов с медленным случаем и получил следующие результаты:

  • Самый быстрый - ksh93
  • Далее идет моя Bourne Shell (в 2 раза медленнее, чем ksh93)
  • Далее идет bash (в 3 раза медленнее, чем ksh93)
  • Последний - ksh88 (в 7 раз медленнее, чем ksh93)

Причина, по которой ksh93 является самым быстрым, кажется, в том, что ksh93 не использует mbtowc () из libc, а скорее использует собственную реализацию.

Кстати: Стефан ошибается, говоря, что размер чтения имеет некоторое влияние. Я скомпилировал Bourne Shell для чтения блоками по 4096 байт вместо 128 байт и получил одинаковую производительность в обоих случаях.

-6
12.04.2018, 14:53
2 ответа

$_ — это специальный параметр, такой же, как $1, $-и т. д. Он реализован как переменная в Bash, но его не следует рассматривать как таковой. См. раздел специальных параметров в руководстве Bash :

.

The shell treats several parameters specially. These parameters may only be referenced; assignment to them is not allowed.

Специальные параметры не являются переменными.

Вы не можете экспортировать его, потому что Bash требует, чтобы :каждый раз, когда анализируется команда, флаг экспорта сбрасывался для _переменной .

2
28.01.2020, 05:21

Потому что $_— это специальный параметр оболочки Bash, а не общая переменная.

Связанный вопрос:Когда `_`является переменной окружения оболочки bash?

1
28.01.2020, 05:21

Теги

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