простое выполнение команды внутри цикла while - сценарии оболочки Bourne - PullRequest
1 голос
/ 07 августа 2010

У меня есть файл с именем inp.txt, в котором перечислены 3 имени каталога

#!/bin/sh
while read dirname
do
        echo $dirname
        "ls -l" $dirname
done < inp.txt

Когда я запускаю вышеупомянутое, я получаю эту ошибку:

line 5: ls -l: command not found

Если я сделаю просто "ls" вместо "ls -l", это будет нормально работать. Что мне здесь не хватает?

Ответы [ 3 ]

7 голосов
/ 07 августа 2010

Избавьтесь от кавычек.

while read dirname
do
        echo "$dirname"
        ls -l "$dirname"
done < inp.txt

Когда у вас есть кавычки, вы говорите: «рассматривайте это как одно слово». Оболочка ищет исполняемый файл с именем ls -l вместо передачи аргумента -l команде ls.

Примечание Nitpicker: Если вы хотите правильно использовать кавычки, добавьте их вокруг "$dirname". В противном случае, если у вас есть каталог с именем «Музыкальные файлы» с пробелом в имени, без кавычек ваш скрипт будет обрабатывать это как два имени каталога и печатать что-то вроде:

ls: Music: No such file or directory
ls: Files: No such file or directory
1 голос
/ 07 августа 2010

Оболочка интерпретирует пространство как разделитель аргументов.Размещая кавычки вокруг чего-либо, вы заставляете shell видеть это как один аргумент.При выполнении оболочка интерпретирует первый аргумент как команду для выполнения.В этом случае вы говорите ему выполнить команду с именем «ls -l» без аргументов, вместо «ls» с аргументом «-l».

1 голос
/ 07 августа 2010

Вы должны удалить кавычки вокруг ls -l.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...