Определение источника bashrc файл перестало работать с ssh-t

и и или не являются коммутативными во многих языках программирования, например, C, C++, C♯, оболочках, find и многих других.

Они используют ленивые оценки слева направо, т.е. сначала вычисляют термин слева, а затем, при необходимости, только справа. Поэтому в false и b, b не вычисляется, так как ответ всегда ложный. Но в b и false вычисляется b, так как еще не было видно, что второй член ложен.

Это не имеет значения, когда члены являются чистыми функциями, т.е. предикатом (что-то, что возвращает булев и ничего больше не делает), но когда он что-то делает (имеет побочные эффекты), то это имеет значение.

-печать что-то делает. Она печатает, поэтому это имеет значение.

Обратите внимание, любая система, которая допускает побочные эффекты (такие как -печать), должна определять порядок оценки, и слева направо, вероятно, самая простая.

1
28.08.2014, 00:59
1 ответ

Когда вы делаете:

ssh serva -t "source ~/.bashrc"

ssh сообщает sshd вызвать оболочку входа в систему удаленного пользователя как:

the-shell -c 'source ~/.bashrc'

Это сообщает оболочке выполнить эту команду и выйти.

Вероятно, вам нужно запустить интерактивную оболочку и получить эту интерактивную оболочку для запуска этой команды source ~ / .bashrc , а затем , чтобы выдать приглашение и прочитать другие команды казнить от вас.

Во-первых, обратите внимание, что в случае source ~ / .bashrc это не требуется, поскольку bash уже создает ваш ~ / .bashrc , когда он интерактивен (фактически по ssh , он делает это даже в неинтерактивном режиме). Итак:

ssh serva

Достаточно.

Теперь, если вы хотите запустить команду, а затем интерактивную оболочку, вы должны сделать:

ssh -t serva 'cmd; bash'

(здесь -t требуется, поскольку ssh не 'не запускает псевдотерминал по умолчанию при передаче команды для выполнения)

cmd не будет выполняться этим bash , хотя (он будет выполняться оболочкой (ваша оболочка входа там ) запущен sshd для интерпретации этого cmd; bash командная строка).

Если вы хотите, чтобы интерактивный bash запускал эту команду. Уловка заключается в использовании переменной PROMPT_COMMAND bash . bash интерпретирует содержимое этой переменной как код оболочки, который должен выполняться перед каждым запросом. Итак, вы можете сделать:

ssh -t serva 'PROMPT_COMMAND="cmd; unset PROMPT_COMMAND" bash'
1
27.01.2020, 23:52

Теги

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