Показать статистику
+1 голос
от (2.5тыс. баллов)

printenv отображает переменные среды, но почему я не вижу других переменных, например, PS1 для настройки приглашения оболочки? Что именно printenv выводит и почему не берет PS1? Есть ли более полная команда вывода, которая делает больше, чем printenv?

284 просмотров 1 ответов

1 Ответ

0 голосов
от (26.4тыс. баллов)

Это потому, что PS1 обычно не экспортируется. Переменные среды используются для установки среды выполнения дочерних процессов; PS1 не нужно экспортировать - это просто переменная оболочки .

Если вы запустите интерактивную дочернюю оболочку, она прочитает и установит ее PS1 из файла ресурсов оболочки, например ~/.bashrc.  При  export PS1  вы увидите это в printenv.

Есть более полная команда вывода, которая делает больше, чем printenv.

printenv печатает только переменные окружения , что можно считать преимуществом. Но если вы хотите также печатать переменные оболочки, используйте echo "$x" (или printf '%s\n' "$x", что более надежно ) вместо printenv x.

printenv это внешняя команда, не встроенная в вашу оболочку, а является отдельной программой из вашей оболочки. Он показывает свои собственные переменные окружения, которые наследуются от оболочки, которую вы используете для его запуска. Однако оболочки не передают все свои переменные в среду своих подпроцессов. Вместо этого они поддерживают различие между тем, какие переменные являются переменными среды, а какие нет. Те, которые не являются, часто называют переменными оболочками.

от (2.5тыс. баллов)
0

Что лучше использовать printf или echo?

от (26.4тыс. баллов)
редактировать от
0

Вспоминается случай, когда приходилось использовать printf, потому что echo не работал для подачи текста в какую-то программу на RHEL, но printf работал.

По сути, это проблема переносимости и надежности.

Первоначально echo не принимал никакой опции и ничего не расширял. Все, что он делал, это выводил свои аргументы, разделенные пробелом и заканчивающиеся символом новой строки.

Теперь сделали так, чтобы мы  могли делать такие вещи, как echo "\n\t" вывод символов новой строки или табуляции, или иметь возможность не выводить завершающий символ новой строки.

Затем еще сложнее, вместо того, чтобы добавить эту функциональность в оболочку (например, perl когда внутри двойных кавычек \t фактически означает символ табуляции), добавилось ее echo.

Теперь, когда стандартная UNIX echo получает аргумент, который содержит два символа, \ и t вместо их вывода он выводит символ табуляции. И как только он видит \c в аргументе, он прекращает выводить, поэтому завершающий символ новой строки тоже не выводится.

Другие оболочки и производители версии Unix решили сделать это по-другому Они добавили -e опцию расширения escape-последовательностей и -n опцию не выводить завершающий перевод строки. У некоторых есть -E возможность отключить escape-последовательности, у некоторых есть, -n но нет -e, список escape-последовательностей, поддерживаемых одной echo реализацией, не обязательно совпадает с поддерживаемым другой.

В тех echo реализациях , которые поддерживают варианты, нет вообще никакой поддержки со стороны , -- чтобы отметить конец опций (Zsh и другие поддержки - для этого) Так, например, трудно вывести "-n" с echo во многих оболочках.

В некоторых оболочках, таких как bash1 или ksh932 или yash ($ECHO_STYLE переменная), поведение зависит даже от того, как была скомпилирована оболочка. Две bash echo пары, даже из одной и той же версии bash, не могут вести себя одинаково.

Вы не можете использовать echo для отображения неконтролируемых данных. Другими словами, если вы пишете сценарий, и он принимает внешние данные (от пользователя в качестве аргументов или имена файлов из файловой системы), Вы не можете использовать его echo для отображения.

Возможно, вы захотите использовать printf для его параметров форматирования. echo полезно, когда дело доходит до печати значения переменной или простой строки, но это все, что нужно сделать. printf может в основном делать то, что может делать C-версия.

Рассмотрим пример использования и возможности:

echo

echo "*** Backup shell script ***"
echo
echo "Runtime: $(date) @ $(hostname)"
echo

printf

vech="bike" printf "%s\n" "$vech"

printf "some\nmulti-lined\ntext\n"

Одним из преимуществ, будет то, что вам не нужно говорить, что он echo интерпретирует определенные escape-последовательности, такие как \n. Он знает, как их интерпретировать, и для этого не требуется -e.

printf "some\nmulti-lined\ntext\n"

последнее \n необходимо, echo подразумевается, если вы не предоставите -n опцию

или так

echo -e "some\nmulti-lined\ntext"

Посмотрите на последний \n в printf. В конце концов, это вопрос вкуса и требований, что вы будете использовать - echo или же printf. 

Одним из недостатков printf - производительность, поскольку встроенная оболочка echo намного быстрее. Разница между мобильностью и производительностью. Не всегда обязательно использовать printf.

printf в настоящее время встроен в большинство оболочек, таких как bash, dash, ksh, zsh, yash, некоторые производные pdksh включают в себя оболочки, обычно встречающиеся и в cygwin). Единственными заметными исключениями являются некоторые pdksh производные.

...