SSH с EOF правильно устанавливает $ PATH, но почему он не работает без EOF? - PullRequest
0 голосов
/ 19 апреля 2019

Я бы хотел понять, почему ssh не устанавливает $ PATH в соответствии с тем, что определено в .profile, но, похоже, делает это, когда ssh использует EOF.

Я бы хотел запустить эту строку в моем скрипте:

DIR_EXPANDED=`ssh $TOADDRESS "$(typeset -f get_dir); get_dir $DIR $DBNAME"`

Где get_dir определяется так:

function get_dir() {
  DIRECTORY_NAME=$1
  DBNAME=$2

  if [ -z "$DIRECTORY_NAME" ]; then
    echo "Enter Directory Name:"; read DIRECTORY_NAME
  elif [ -n "$2" ]; then
    . oraenv $DBNAME
  fi
  DIRECTORY=`sqlplus -s '/ as sysdba' << EOF
  set pages 0 head off feed off

  select directory_path from all_directories where directory_name='$DIRECTORY_NAME';

EOF`

  echo $DIRECTORY;
}

Однако запуск скрипта приводит к ошибке

ksh[10]: .: oraenv: cannot open [No such file or directory]

Что я нашел, так это то, что при ssh'ing путь не был правильно задан, что демонстрируется этим:

ssh $TOADDRESS 'echo $PATH'
/usr/local/bin:/usr/bin

Методом проб и ошибок я обнаружил, что это работает:

TODIR_EXPANDED=`ssh $TOADDRESS << EOF
  $(typeset -f get_dir); get_dir $TODIR $TODBNAME
EOF`

Может кто-нибудь объяснить, почему ssh работает таким образом? А также как / если можно было бы использовать однострочник, который я впервые описал?

1 Ответ

1 голос
/ 19 апреля 2019

Если вы используете ssh HOST command, загружается неинтерактивная оболочка, которая не читает .profile для оболочек входа в систему или .kshrc для интерактивных оболочек.

Если вы используете ssh HOST, он запускает интерактивную оболочку (хотя и без выделенного псевдо-TTY) и читает .kshrc (или аналогичный, в зависимости от фактической порожденной оболочки), а затем продолжает чтение команд со стандартного ввода.

Итак, если вы хотите сделать функции доступными, вы можете сделать это следующим образом:

DIR_EXPANDED=$(ssh $TOADDRESS ". ./.kshrc; $(typeset -f get_dir); get_dir $DIR $DBNAME")

(Я также изменил устаревшую форму подстановки команд (используя серьезный акцент) на современную форму / POSIX, поскольку это исправляет некоторые ошибки.)

...