Но как мне узнать, какие команды предоставляет определенный пакет?
В Linux нет ничего похожего на "команды". Если вас интересует, какие файлы предоставляет пакет, есть rpm
:
rpm -ql package_name
А исполняемые файлы, они же "команды", обычно находятся по пути /usr/bin/
.
ИМХО редактирование файла, который вы читаете, чревато опасностью. Позвольте мне предложить другое решение:
urls.lst
)построчно wget
URL received.lst
)Если процесс прерван и вы хотите перезапустить его со списком URL-адресов, которых у вас еще нет, вы можете получить этот список с помощью:
diff --new-line-format="" --unchanged-line-format="" urls.lst received.lst
Вы выбрали неправильную процедуру.
Предположим, что значение a
начинается с1
:a=1
Когда сценарий считывает filename
в строке done<"$filename"
, считывается содержимое файла (, как оно есть на тот момент времени ). Затем вы изменяете тот же файл в -поместите удалив одну строку (давайте предположим первую ), тогда следующее чтение возьмет вторую исходную строку (теперь первую в файле ), но удалит индекс строки 2 (, который теперь является третьим )в настоящем деле. Так далее и тому подобное.
Чтобы посмотреть, что произойдет, запустите этот скрипт:
#!/usr/bin/bash
a=1
filename=infile
seq 5 >"$filename"
while read -r line; do
echo "Read line $line for index $a"
echo "Will remove line $(sed "${a}!d" "$filename")"
sed -ie "${a}d" "$filename"
echo;echo next
let a+=1
done < "$filename"
Вот так:
$./script
Read line 1 for index 1
Will remove line 1
next
Read line 2 for index 2
Will remove line 3
next
Read line 3 for index 3
Will remove line 5
next
Read line 4 for index 4
Will remove line
next
Read line 5 for index 5
Will remove line
next
Как видите, строки 1,3,5 удалены.
Чтобы сделать это правильно :либо
Реализация третьего варианта с помощью уже известных вам инструментов:
#!/usr/bin/bash
filename=infile
seq 5 >"$filename"
while [[ -s "$filename" ]]; do
name=$(head -n1 "$filename")
echo wget "$name"
sed -i '1d' "$filename"
done