startx
и xinit
возьмите X-клиент на их командной строке. Это может быть названием менеджера окон или менеджера сеансов.
startx awesome
Если Вы не передаете этот аргумент, то они запускают скрипт ~/.xinitrc
, который ответственен за запуск Вашего менеджера окон. В отсутствие этого файла они используют некоторое системное значение по умолчанию.
Замены параметра могут использоваться для замены текста без любых проблем выхода:
output=$(ls -t downloads | while IFS= read -r f; do
echo "<a href=\"downloads/$f\">$f</a>"
done)
html=$(<index.html)
html=${html/placeholder/$output}
echo "$html" > output.html
Вы могли также использовать awk -v
передать текст замены как переменную:
awk -v v="$output" '{sub("placeholder",v);print}' index.html > output.html
Или используйте Ruby для замены многострочного шаблона, не требуя заполнителя:
echo "$output" | ruby -i -e 'print gets(nil).sub(/<a .*<\/a>\n/m, STDIN.read)' index.html
Если Вы просто хотите заменить все содержание файла, вместо того, чтобы так или иначе вставить Ваш вывод в середине, то Ваша попытка № 1 может быть ближе к тому, на основе чего Вы хотите, чем подход sed
, если Вы перенаправляете вывод всего цикла:
#!/bin/bash
list_dir=`ls -t downloads/`
for i in $list_dir
do
echo "<a href=\"downloads/$i\">$i</a>"
done > index.html
Существуют многочисленные проблемы с Вашим sed
строка, например, с переменной $i
в одинарных кавычках, никогда не расширяемых.
Учитывая следующий index.html:
<html>
<body>
<!-- placeholder -->
</body>
</html>
попытайтесь использовать посреднические файлы для sed
в/производить:
#!/bin/bash
list_dir=`ls -t downloads/`
cp index.html out.html
for i in $list_dir
do
sed "s/<!-- placeholder -->/<a href='downloads\/$i'>$i<\/a>\n<!-- placeholde
r -->/" out.html > tmp.html
mv tmp.html out.html
done
cat out.html
Конечно, Вы столкнетесь с проблемами, когда будут имена файлов с пробелами в них, но это - другая проблема.