Что делает update_terminal_cwd в терминале OS X

21

Я озадачен этим довольно давно. В $PROMPT_COMMANDbash в OS X есть команда с именем update_terminal_cwd. Я уверен, что это не встроенный bash, и, скорее всего, существует только в OS X. Но я не знаю, что именно он делает. Кто-нибудь знает?

Chong
источник

Ответы:

26

Он обновляет запрос на отображение текущего рабочего каталога (CWD) и определяется в /etc/bashrc:

update_terminal_cwd() {
    # Identify the directory using a "file:" scheme URL,
    # including the host name to disambiguate local vs.
    # remote connections. Percent-escape spaces.
    local SEARCH=' '
    local REPLACE='%20'
    local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}"
    printf '\e]7;%s\a' "$PWD_URL"
}
Пол Гилфеддер
источник
Возможно, стоит отметить, что функция определяется только в том случае, если вы запускаете свою оболочку в приложении Apple Terminal. Если вы используете iTerm, он не будет определен.
nwinkler
Какого черта побег-7 и где он печатает? Где это задокументировано? :)
Wildcard
1
@Wildcard Это xtermуправляющий код для установки текста в строке заголовка. Наиболее доступной документацией является, пожалуй, Linux Bash Prompt Howto . В источниках есть реальная документация xterm, IIRC.
tripleee
2
Эта функция установлена ​​в строке 9 /etc/bashrc_Apple_Terminal(найдена с помощью уловки, изученной здесь ). Но я обнаружил, что в сеансе экрана $ PROMPT_COMMAND становится пустой строкой, что означает, что, /etc/bashrc_Apple_Terminalвероятно, больше не выполняется. Ты знаешь почему?
Zyxue
1
@zyxue, если вы посмотрите /etc/bashrc, он использует переменную, $TERM_PROGRAMчтобы определить терминал и запустить соответствующий, /etc/bashrc_$TERM_PROGRAMесли он существует. Таким образом, в сеансе экрана, $TERM_PROGRAMвероятно, не установлен или установлен на что-то другое, чем Apple_Terminal.
Дэвид Моулз
-15

Строка формата с непрозрачным секретным кодированием, '\ e] 7;% s \ a'. Подозреваемый.

local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}"

Из того, что я собираю, "file: // $ HOSTNAME" замаскирован, поэтому вы не можете видеть удаленный протокол: шпионаж хоста.

user982671
источник
1
... или $ HOSTNAME - это переменная, которая изменяется в зависимости от системы, в которой выполняется скрипт. ?!? Параноик много? Если вы считаете, что код, указанный в другом ответе, может выполнять что-либо, кроме печати на экране, вы не представляете, как работает сценарий bash.
tubedogg
Вы не получили памятку? - Уязвимость bash «ShellShock» web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-6271 В любом случае 1) Неизвестный источник, из-за которого я не установил переменную среды update_terminal_cwd 2) Вкл. В довершение всего, это функция. Автоматически подозреваю. Массовая инфильтрация. Никто не хочет этого. Может быть, NIST сообщит об уязвимостях Apple OSX и браузера Firefox / Chrome / Opera?
user982671
7
Вы продолжаете демонстрировать, что понятия не имеете, о чем говорите. update_terminal_cwdэто не переменная окружения, это имя функции. Он определен в виде обычного текста, /etc/bashrcи printfфункция не может ничего делать, кроме печати отформатированных строк на экране. Наконец, ссылка на vuln, которую вы разместили, включает в себя выполнение произвольных функций путем добавления текста к определению переменной среды ... который не имеет ничего общего с тем, что обсуждается здесь. И как браузеры имеют отношение к сценариям оболочки?
tubedogg
Это не пытается ответить на вопрос, который был задан (см. Здесь для подробного анализа, чтобы оправдать это утверждение). Пожалуйста, зарезервируйте поле для ответов, которые отвечают на заданный вопрос. Спасибо!
DW
1
@tubedogg хаха, да, если вы просто сделаете a, typeset -fон покажет все «пользовательские» функции, и вот как это появилось. Если бы они пытались сделать что-то отрывочное, они бы не сделали это легко заметным.
Колоб Каньон