Если вы хотите иметь ровно одно место для каждой точки монтирования, кроме root /
, вы можете использовать стандарт /mnt/my-mount-point
. И, наконец, символическая ссылка, если это необходимо.
Я делаю это, например, для своей домашней папки и нахожу ее очень чистой, но в конечном счете -это мнение основано на мнении.
Я монтирую /dev/sda1
в /mnt/downloads
, но хочу получить доступ к этой папке из ~/downloads
. Поэтому я делаю символическую ссылку с помощью утилиты ln
:
ln -s /mnt/downloads $HOME/downloads
А теперь делаем
cd ~/downloads
Эквивалентно
cd /mnt/downloads
Если вы передаете его через 2 команды ssh, вы должны заключить в кавычки -escape-строку ДВАЖДЫ. Сделайте это с помощью дополнительного назначения PHRASE=${PHRASE@Q}
.
Однако имейте в виду, что и ${var@Q}
, и printf %q
(, описанные ниже ), будут использовать escape-формат $'...'
quote -, который может не поддерживаться удаленной оболочкой .
После исправления последней строки скрипта test.sh
на echo "$bval"
вместоecho $bval
:
PHRASE="multi word arg"
PHRASE=${PHRASE@Q}
ssh -A user@host1 ssh -A user@host2 "bash -s" -- <./test.sh -b "${PHRASE@Q}"
multi word arg
Вместо формы расширения ${var@P}
, которая не поддерживается в старых версиях bash, вы можете использоватьprintf -v var %q
:
PHRASE="multi word arg"
printf -v PHRASE %q "$PHRASE"
printf -v PHRASE %q "$PHRASE"
ssh -A user@host1 ssh -A user@host2 "bash -s" -- <./test.sh -b "$PHRASE"
Кроме того, вместо передачи вашего скрипта через стандартный ввод, что неэффективно (bash будет выполнять системный вызов чтения для каждого байта при чтении скрипта из стандартного ввода ), вы можете просто поместить весь скрипт и его аргументы в переменная:
printf -v cmd 'bash -c %q bash -b %q' "$(cat test.sh)" 'multi word wahterve'
printf -v cmd %q "$cmd"
ssh localhost ssh localhost "$cmd"
multi word wahterve