2016-01-24 2 views
-3

Я создал два файла в Unix, скажем filename1 и filename2. Я могу видеть содержимое обоих файлов. Но когда я выполнения одной командыUnix - Разрешение отрицательно

filename1 >& filename2 

Я не могу открыть файл filename2. Он бросает ошибку

/.filename1 : Permission denied. 

Полный код:

bash-4.3$ cat>filename1 
Hi all 
bash-4.3$ cat> filename2 
Hi all 
bash-4.3$ cat filename1 
Hi all 
bash-4.3$ cat filename2 
Hi all 
bash-4.3$ filename1 >& filename2 
bash-4.3$ cat filename1 
Hi all 
bash-4.3$ cat filename2 
bash: ./filename1:Permission denied 
+0

Что такое "/" перед именем файла1? – SMA

+0

Показать вывод 'ls -l filename1 filename2' (если в текущем каталоге) –

+0

@SMA 'тег оболочки' – Deepak

ответ

0

запустить

chmod +x filename1 
chmod +w filename2 

Необходимость проверить настройки, а также ваш затирать. Это зависит от используемой оболочки. Погугли это!

EDIT

Для Баш

set +o noclobber 

Затем вы можете перезаписать файлы. Неплохая идея

+0

Почему это бесполезно - установка бит выполнения для скрипта? –

+0

@Ed Heal bash shell – Deepak

+0

@EdHeal: Ничего, я не заметил, что 'filename1' является исполняемым. Я удалю свой предыдущий комментарий. –

0

Совершенно не ясно, что вы пытаетесь сделать. По-видимому, filename1 является (предполагается) исполняемым сценарием оболочки. filename2 содержит результат выполнения этого скрипта.

bash-4.3$ cat>filename1 
Hi all 

Это создает файл с именем filename1, содержащий одну строку текста, Hi all.

bash-4.3$ cat> filename2 
Hi all 

То же самое для filename2.

bash-4.3$ cat filename1 
Hi all 
bash-4.3$ cat filename2 
Hi all 

И вы подтверждаете их содержание.

bash-4.3$ filename1 >& filename2 

Это пытается выполнить filename1, перенаправляя как его стандартный вывод и стандартный поток ошибок в filename2.

Поскольку вы не сделали chmod +x filename1, при попытке выполнить его вы получите сообщение об ошибке «Разрешение отказа». Даже если вы сделали chmod, это не сработало, потому что filename1 не является допустимым скриптом (если только у вас нет команды с именем Hi). Подробнее об этом ниже.

bash-4.3$ cat filename1 
Hi all 
bash-4.3$ cat filename2 
bash: ./filename1:Permission denied 

filename2 содержит выход (нет) и сообщение об ошибке вы получили, когда вы пытались выполнить filename1. Предыдущее содержимое filename2 было сбито, что означает, что в создании его не было никакого смысла.

Bash поддерживает синтаксис >& для перенаправления как stdout, так и stderr, но это не рекомендуется. &> является предпочтительным (по крайней мере, согласно документации по bash). Или, более конкретно, вы можете написать filename1 >filename2 2>&1.

Тот факт, что вы смогли выполнить скрипт, набрав только filename1, указывает, что у вас есть ., текущий каталог, в вашем $PATH. Это плохая идея. (. в начале вашего $PATH особенно опасен.) Вы должны удалить . с $PATH; если вы хотите выполнить команду в текущем каталоге, прикрепите ее к ./.

Вот как сделать, чтобы что-то подобное, что вы , кажется, пытается сделать:

$ cat > script 
#!/bin/bash 

echo Hi all 
$ chmod +x script 
$ ./script &> output 
$ cat output 
Hi all 
$ 

Обратите внимание на #!/bin/bash я добавил в верхней части сценария. Каждый исполняемый скрипт должен иметь строку #!, чтобы указать, как он выполняется.

+0

Большое спасибо. Я понял проблему и где я делал неправильно. Поскольку я только начал изучать Unix, я не смог понять вывод этой команды. – Deepak

Смежные вопросы