Очень распространенным (хотя и не совсем надежным) способом проверки наличия интерактивного терминала является проверка того, установлен ли PS1
:
if [[ -z "$PS1" ]]; then
echo "Probably run as a script."
else
echo "Probably interactive."
fi
Другая альтернатива - проверка наличия опции i
в $-
:
case "$-" in
*i*)
echo "Probably interactive"
;;
*)
echo "Probably scripted"
;;
esac
Существует также опция -t
для test
(он же [
и его кузен, [[
):
fd=0 # stdin
if [[ -t "$fd" ]]; then
echo "Interactive"
else
echo "Scripted"
fi
Совет Linux Documentation Project.
dash
и sh
могут не иметь [
и [[
, поэтому вам, возможно, придется явно использовать test
, например. Например:
fd=0
if test -t "$fd"; then # you might need /path/to/test
echo "Interactive"
else
echo "Scripted"
fi
Поскольку test
является собственным двоичным файлом, я уверен, что все, что использует test -t
, не зависит от оболочки.
Параметр --exclude-from
указывает файл, который локальный процесс rsync должен прочитать, чтобы добавить в список исключений. Он не поддерживает нотацию, которую вы использовали для чтения файла с удаленного хоста; он интерпретирует имя файла как путь к локальному файлу, поэтому вы получаете сообщение об ошибке failed to open exclude file username@example.com:remote/path/to/folder/to/sync/.rsyncignore
при попытке открыть именно этот файл.
Я не думаю, что есть способ сделать то, что вы хотите, кроме как сначала передать файл .rsyncignore
на локальный хост, а затем сослаться на этот файл с помощью опции --exclude-from
.
Вам может помочь использование параметра -F
, указывающего для каждого -файла каталога .rsync-filter
, который считывается на стороне источника.