2012-05-29 3 views
1

Я новичок в сценариях оболочки. Я хочу удалить все содержимое каталога, находящегося в домашнем каталоге пользователя, и удалить некоторые файлы, соответствующие моим условиям. После некоторого времени googled, я создал следующий скрипт.Удаление содержимого каталога с использованием сценариев оболочки

#!/bin/bash 
#!/sbin/fuser 


PATH="$HOME/di" 

echo "$PATH"; 

if [ -d $PATH ] 
then 
rm -r $PATH/* 
fuser -kavf $PATH/.n* 
rm -rf $PATH/.store 
echo 'File deleted successfully :)' 
fi 

Если я запустить сценарий, я получаю ошибку следующим образом,

/users/dinesh/di 
dinesh: line 11: rm: command not found 
dinesh: line 12: fuser: command not found 
dinesh: line 13: rm: command not found 
File deleted successfully :) 

Может кто-нибудь помочь мне с этим?

Заранее спасибо.

ответ

3

Вы изменяете переменную PATH, которая используется ОС, определяет путь для поиска утилит (так что вы можете вызвать его, не вводя полный путь к двоичному файлу). Система не может найти rm и fuser в папках, в настоящее время заданных PATH (так как вы перезаписали ее с удаляемым каталогом), поэтому она печатает ошибку.

tl; dr НЕ использовать PATH как ваше собственное имя переменной.

+0

Спасибо nhahtdh :) – Dinesh

2

Эта линия:

PATH="$HOME/di" 

удаляет все стандартные каталоги с вашей переменной PATH (так что такие команды, как rm, которые обычно встречаются в /bin или /usr/bin являются «отсутствующими»). Вы должны написать:

PATH="$HOME/di:$PATH" 

Это сохраняет то, что уже в $ PATH, но ставит $HOME/di упреждающего этого. Это означает, что если у вас есть пользовательская команда в этом каталоге, она будет вызываться вместо стандартного в /usr/bin или где угодно.

Если вы намерены удалить каталог $HOME/di, то вы не должны использовать $ PATH в качестве переменной. Вы можете использовать $path; имена переменных чувствительны к регистру. Или вы можете использовать $dir или любое из множества других имен. Вам нужно знать ключевые переменные среды и избегать сбивания или злоупотребления ими. Из ключевых переменных окружения $PATH является одним из самых ключевых ($ HOME - другое, на самом деле, после этих двух, большинство остальных относительно менее важно). Обычно имена верхнего регистра зарезервированы для переменных среды; используйте имена нижних регистров для локальных переменных в скрипте.

+1

Он хочет удалить материал из каталога. Я не уверен, но у меня такое чувство, что здесь может быть катастрофа. – nhahtdh

+1

Он не должен сильно навредить '/ bin' или'/usr/bin', и в любом случае '$ HOME/di:/bin:/usr/bin' вряд ли будет существовать как каталог. Я согласен с тем, что он неправильно использует PATH; у меня есть мой голос по этому поводу, и я добавил некоторую информацию в свой ответ. –

+0

Спасибо Jonathan :) – Dinesh

2

PATH - это специальная переменная, которая контролирует, где система ищет исполняемые команды (например, rm, fuser и т. Д.). Когда вы устанавливаете его на /users/dinesh/di, он тогда выглядит там для всех последующих команд и (конечно) не может их найти. Решение: используйте другое имя переменной. На самом деле, я бы рекомендовал использовать строчные переменные в сценариях оболочки - есть несколько имен зарезервированных переменных в верхнем регистре, и если вы попытаетесь использовать любой из них, у вас возникнут проблемы. Придерживание нижнего регистра - это простой способ избежать этого.

BTW, в общем случае лучше всего включать переменные в двойные кавычки, когда вы их используете, чтобы избежать проблем с некоторыми синтаксическими разборами оболочки после их замены. Например, используйте [ -d "$path" ] вместо [ -d $path ]. $path/* немного сложнее, так как * не будет работать внутри кавычек. Решение: rm -r "$path"/*.

Random другие замечания: #!/sbin/fuser линия не делает. Только первая строка скрипта может действовать как shebang. Кроме того, не стоит ставить ; в конце строк в сценариях оболочки.

#!/bin/bash 

path="$HOME/di" 

echo "$path" 

if [ -d "$path" ] 
then 
rm -r "$path"/* 
fuser -kavf "$path"/.n* 
rm -rf "$path/.store" 
echo 'File deleted successfully :)' 
fi 
Смежные вопросы