Я хочу создать tar-файл на другом сервере. Когда я выполняю эту команду, она работает, но когда я помещаю эту команду в свой сценарий оболочки, она возвращает ошибку.
tar cvzf - prod_test.txt| ssh oracle@192.168.1.248 "cat > prod_test5.tar.gz"
tar: -: Невозможно статистика: Нет такого файла или каталога tar: prod_test.txt |: Cannot stat: Нет такого файла или каталога tar: ssh: Cannot stat: Нет такого файл или каталог tar: (скрытый) Cannot stat: Нет такого файла или каталог tar: "cat: Cannot stat: Нет такого файла или каталога tar:>: Невозможно статистика: нет такого файла или каталога tar: prod_test4.tar.gz ": Невозможно stat: нет такого файла или каталога v ÷ Om7 7Þ '(tar:
#!/bin/sh
dy=`date +%a`
bk='/d01/backup'
trans_oracle='tar cvzf - prod_test.txt| ssh oracle@192.168.1.248 "cat > prod_test4.tar.gz"'
del_oracle='rm -f '$bk'/'$dy'_apps_indus_prod.tar.gz'
echo '****** Start Time ******' >> bk'/'$dy'_transfer_apps_bk_net.log'
date >> $bk'/'$dy'_transfer_apps_bk_net.log'
printf '\n' >> $bk'/'$dy'_transfer_apps_bk_net.log'
--#Transfer Backup
$trans_oracle
--#Delete Backup
#$del_oracle
echo '****** End Time ******' >> $bk'/'$dy'_transfer_apps_bk_net.log'
date >> $bk'/'$dy'_transfer_apps_bk_net.log'
printf '\n' >> $bk'/'$dy'_transfer_apps_backuplog.log'
printf '\n' >> $bk'/'$dy'_transfer_apps_backuplog.log'
error
tar: -: Невозможно stat: Нет такого файла или каталога tar: prod_test.txt | : Cannot stat: Нет такого файла или каталога tar: ssh: Cannot stat: Нет такого файл или каталог tar: (скрытый) Cannot stat: Нет такого файла или каталог tar: "cat: Cannot stat: Нет такого файла или каталога tar:>: Невозможно статистика: нет такого файла или каталога tar: prod_test4.tar.gz ": Невозможно stat: нет такого файла или каталога v ÷ Om7 7Þ '(tar: задержка выхода из-за ошибки из предыдущих ошибок -
Код:
#!/bin/sh
dy=`date +%a`
bk='/d01/backup'
#Transfer Command
trans_oracle='tar cvzf - prod_test.txt| ssh oracle@192.168.1.248 "cat > prod_test4.tar.gz"'
#Delete Command
del_oracle='rm -f '$bk'/'$dy'_apps_indus_prod.tar.gz'
echo '****** Start Time ******' >> $bk'/'$dy'_transfer_apps_bk_net.log'
date >> $bk'/'$dy'_transfer_apps_bk_net.log'
printf '\n' >> $bk'/'$dy'_transfer_apps_bk_net.log'
#Transfer Backup
$trans_oracle
#Delete Backup
#$del_oracle
echo '****** End Time ******' >> $bk'/'$dy'_transfer_apps_bk_net.log'
date >> $bk'/'$dy'_transfer_apps_bk_net.log'
printf '\n' >> $bk'/'$dy'_transfer_apps_backuplog.log'
printf '\n' >> $bk'/'$dy'_transfer_apps_backuplog.log'
Чтобы показать проблему, которую вы получаете, будет достаточно небольшого теста:
По отдельности это работает нормально:
ls; pwd
затем мы делаем это
cmd='ls ; pwd'
Теперь $ cmd
выдаст ошибку, файлы с именами ';' и 'pwd' отсутствуют.
Именно здесь появляется команда "eval", когда вы хотите дать оболочке еще одну попытку:
eval "$cmd"
выполняется успешно, как если бы вы указали ее в командной строке.
Поэтому вместо $ trans_oracle дайте ему следующий вид: eval "$ trans_oracle"