Как воспроизвести восклицательный знак без обратной косой черты в выводе, чтобы предотвратить расширение

rsync -rv /home/myname/mydir1/* myhost:/home/myname/mydir1

будет копировать файлы только в mydir1 (и подкаталоги)

rsync -rv /home/myname/mydir1 myhost:/home/myname/mydir1

скопирует сам каталог, поэтому вы получите mydir1/mydir1

    francois@zaphod:~/tmp$ rm -rf b
    francois@zaphod:~/tmp$ mkdir b
    francois@zaphod:~/tmp$ rsync -rv a/* b
    sending incremental file list
    a

    sent 80 bytes  received 35 bytes  230.00 bytes/sec
    total size is 0  speedup is 0.00
    francois@zaphod:~/tmp$ tree b
    b
    └── a

    0 directories, 1 file


 francois@zaphod:~/tmp$ rm -rf b
    francois@zaphod:~/tmp$ rsync -rv a b
    sending incremental file list
    created directory b
    a/
    a/a

    sent 108 bytes  received 63 bytes  342.00 bytes/sec
    total size is 0  speedup is 0.00
    francois@zaphod:~/tmp$ tree b
    b
    └── a
        └── a

    1 directory, 1 file
0
25.03.2021, 17:05
1 ответ

Вам нужно экранировать его или в кавычках, а не оба:

echo \!
echo "!"

Расширение истории Bash игнорирует экранированные восклицательные знаки, одинарные -кавычки и восклицательные знаки, которые появляются непосредственно перед закрывающей двойной кавычкой. Подробнее см. в разделе «История взаимодействия» руководства . Так

echo '!'

тоже работает, и не нужно думать о том, где находится восклицательный знак.

Вы можете комбинировать одинарные кавычки с расширением переменной, используя printfвместо echo.Вы также можете комбинировать несколько форм цитирования в одной команде -строке:

echo '!'"$(echo test)"

В целомprintfлучше, чемecho. Как уже упоминалось, вы также можете полностью отключить расширение истории; не интерактивные оболочки -не включают его по умолчанию.

1
28.04.2021, 22:56

Теги

Похожие вопросы