неожиданный токен `(', определяющий функцию для замены псевдонима в bash - PullRequest
0 голосов
/ 02 мая 2020

Я хочу создать функцию как псевдоним, которая синхронизирует файлы с моим сервером. Но я получаю эту ошибку

-bash: /home/kenan/.aliases: line 2: syntax error near unexpected token `('
-bash: /home/kenan/.aliases: line 2: `rsnos () {'

мой код;

#!/bin/bash
rsnos () {
    local dest_server="dsp"
    local source_path="/home/kenan/django/event_project/"
    local dest_path="${dest_server}:/home/kenan/www"
    local exclude_all="--exclude={'.git','env','secrets.json','.vscode','static','event_project/wsgi.py','manage.py'}"
    local exc_gev="--exclude={'.git','env','.vscode'}"
    local exc_gevs="--exclude={'.git','env','.vscode','static'}"
    local log_rsync="--log-file /home/kenan/rsync.log"

    rsync -e \"ssh\" -a ${exclude_all} ${source_path} ${dest_path} ${log_rsync} --stats
}

Если это неправильный способ делать то, что я делаю, можете ли вы предложить лучший способ?
Спасибо

Ответы [ 3 ]

2 голосов
/ 02 мая 2020

У вас уже есть псевдоним. Я могу воспроизвести проблему с помощью

alias rsnos='echo 123'
rsnos () {
-bash: syntax error near unexpected token `('

Сначала удалите alias с помощью

unalias rsnos

При обновлении с псевдонима до функций (хороший выбор!) Измените имя файла. .alias следует использовать только для alias определений.

2 голосов
/ 02 мая 2020

Приняв unalias для предотвращения немедленной ошибки, а затем используя массивы вместо строк для хранения списков аргументов (по причинам, подробно описанным в BashFAQ # 50 ), мы получаем:

unalias rsnos &>/dev/null ||:

rsnos () {
    local dest_server="dsp"
    local source_path="/home/kenan/django/event_project/"
    local dest_path="${dest_server}:/home/kenan/www"
    local -a exclude_all=( --exclude={'.git','env','secrets.json','.vscode','static','event_project/wsgi.py','manage.py'} )
    local -a log_rsync=( --log-file /home/kenan/rsync.log )

    rsync -e "ssh" -a \
      "${exclude_all[@]}" \
      "${log_rsync[@]}" --stats \
      "$source_path" "$dest_path"
}

Поскольку при выполнении этого способа расширения скобок находятся в контексте без кавычек, они фактически расширяются до отдельных записей списка аргументов (--exclude=.git, --exclude=env и т. Д. c), которые затем могут быть сохранены в и позже расширен из массива.

0 голосов
/ 02 мая 2020

Ваша ошибка не воспроизводится для меня:

$ cat test.sh
#!/bin/bash
rsnos () {
    local dest_server="dsp"
    local source_path="/home/kenan/django/event_project/"
    local dest_path="${dest_server}:/home/kenan/www"
    local exclude_all="--exclude={'.git','env','secrets.json','.vscode','static','event_project/wsgi.py','manage.py'}"
    local exc_gev="--exclude={'.git','env','.vscode'}"
    local exc_gevs="--exclude={'.git','env','.vscode','static'}"
    local log_rsync="--log-file /home/kenan/rsync.log"

    rsync -e \"ssh\" -a ${exclude_all} ${source_path} ${dest_path} ${log_rsync} --stats
}

Когда я запускаю его, сначала я извлекаю файл из своей оболочки, так как файл не вызывает саму функцию. Затем я бегу от своей раковины.

$ . test.sh
$ rsnos
rsync: failed to open log-file /home/kenan/rsync.log: No such file or directory (2)
Ignoring "log file" setting.
ssh: Could not resolve hostname dsp: nodename nor servname provided, or not known
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at /BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-52/rsync/io.c(453) [sender=2.6.9]

Очевидно, что на самом деле я не могу сделать rsyn c, но я не получаю никаких ошибок по поводу функции

...