и
и или
не являются коммутативными во многих языках программирования, например, C, C++, C♯, оболочках, find и многих других.
Они используют ленивые оценки слева направо, т.е. сначала вычисляют термин слева, а затем, при необходимости, только справа. Поэтому в false и b
, b
не вычисляется, так как ответ всегда ложный. Но в b и false
вычисляется b
, так как еще не было видно, что второй член ложен.
Это не имеет значения, когда члены являются чистыми функциями, т.е. предикатом (что-то, что возвращает булев и ничего больше не делает), но когда он что-то делает (имеет побочные эффекты), то это имеет значение.
-печать
что-то делает. Она печатает, поэтому это имеет значение.
Обратите внимание, любая система, которая допускает побочные эффекты (такие как -печать), должна определять порядок оценки, и слева направо, вероятно, самая простая.
Когда вы делаете:
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'