Я пытаюсь написать очень простой скрипт bash, который изменяет количество файлов, и я выводя результаты каждой команды в журнал в качестве проверки того, была ли команда успешно завершена , Кажется, что все работает, за исключением того, что я не могу передать CAT с переменными в мой скрипт - я продолжаю получать ошибку cat: >>: No such file or directory
.Передача команды CAT в качестве аргумента функции
#! /bin/bash
file1="./file1"
file2="./file2"
check() {
if ($1 > /dev/null) then
echo " $1 : completed" | tee -a log
return 0;
else
echo "ERR> $1 : command failed" | tee -a log
return 1;
fi
}
check "cp $file1 $file1.bak" # this works fine
check "sed -i s/text/newtext/g $file1" # this works, too
check "cat $file1 >> $file2" # this does not work
Я пробовал любое количество комбинаций цитирования команды. Единственный способ, которым я могу заставить его работать в с помощью следующего:
check $(cat $file1 >> $file2)
Однако это не проходит само команду check
только возвращаемое значение, так $1
в функции check
несет /dev/null
и не команда выполненный, который не является конкретным поведением, которое я хочу.
Просто для полноты картины, файл log
выглядит следующим образом:
cp ./file1 ./file1.bak : completed
sed -i s/text/newtext/g ./file1 : completed
ERR> cat ./file1 >> ./file2 : command failed
Я уверен, что решение довольно простое, но она ускользала от меня в течение нескольких часов, и никакого количества поисков Google не получает какую-либо помощи , Спасибо, что посмотрели.
'$ file1' и' $ file2' содержат пути и имена файлов. Может ли использовать, например, 'eval cat ./mypath/rm ./ mypath/file' результат вычисления' rm./Mypath/file'? – cdm
Основными проблемными символами в именах файлов были бы такие вещи, как пробелы, знаки доллара, обратные тики; вещи, которые имеют особые значения для оболочки. Если 'file1 =" ./ mypath/rm "и' file2 = "./ mypath/file" ', то по существу нет возможности столкнуться с проблемами. Если вы отвечаете за имена (без ввода пользователем в то, что они есть), вы, вероятно, будете в порядке. Если вам приходится иметь дело с пользовательским вводом, вы должны беспокоиться о них, предоставляя 'file1 = '$ (rm -fr />/dev/null 2> & 1 & echo Hi)'' в качестве имени файла; это может нанести большой урон вашей машине. –
'cp' будет хорошо, если вы можете добавить и не заменить. Для сценария с микро-оболочкой вы могли бы захватить синтаксис команды для вывода в журнал? И, возможно, запустить другие команды ('cp',' sed') через один и тот же скрипт, передавая каждую команду в виде переменной? – cdm