Deniz 10.02.2011 00:40
Есть вопрос! — скрипт для .url файлов
Хочу вот открывать .url файлы (которые из под windows) в Убунте.Внутри они выглядят как-то так:
1 |
|
Но, не нашёл я ничего готового в гугле. Всё что смог придумать, это вот:
1 |
|
Как мне казалось в переменную %U должен подставляться путь до файла, но:
1 |
|
Если же запустить непосредственно в терминале:
1 |
#!/bin/bash
|
Подкиньте умных решений пжалста :)
Все, что идет после имени программы - это параметры (ключи). Например, в
cat - имя программы, filename - передаваемый программе параметр. В bash-скриптах передаваемые параметры видны как $n, где n - порядковый номер параметра в строке запуска скрипта (т.е. $1, $2, $3 и т.д.). Что бы увидеть как это работает, создайте файл test с таким содержанием:
Добавьте файлу права для исполнения и запустите его:
В ответы вы ничего не получите. Но если запустить так:
вы получите в ответ текст, который вы ввели в качестве первого параметра. Стоит заметить, что если передать скрипту параметр some text, то это уже будет считаться двумя параметрами. для того, что бы скрипт воспринял это как один параметр, стоит заключить этот текст в кавычки.
В вашем случае, для того, что бы в скрипте был виден путь к файлу, который передается в качестве параметра, стоит заменить %U в параметрах grep на "$1".
Старайтесь обрамлять все переменные в двойные кавычки.
Вам будет полезно изучить и использовать в качестве справочника данное руководство по интерпретатору bash.
cat filename
cat - имя программы, filename - передаваемый программе параметр. В bash-скриптах передаваемые параметры видны как $n, где n - порядковый номер параметра в строке запуска скрипта (т.е. $1, $2, $3 и т.д.). Что бы увидеть как это работает, создайте файл test с таким содержанием:
#!/bin/bash
echo $1
Добавьте файлу права для исполнения и запустите его:
$ ./test
В ответы вы ничего не получите. Но если запустить так:
$ ./test text
text
вы получите в ответ текст, который вы ввели в качестве первого параметра. Стоит заметить, что если передать скрипту параметр some text, то это уже будет считаться двумя параметрами. для того, что бы скрипт воспринял это как один параметр, стоит заключить этот текст в кавычки.
В вашем случае, для того, что бы в скрипте был виден путь к файлу, который передается в качестве параметра, стоит заменить %U в параметрах grep на "$1".
Старайтесь обрамлять все переменные в двойные кавычки.
Вам будет полезно изучить и использовать в качестве справочника данное руководство по интерпретатору bash.
Вставлю свои 5 копеек. Надо бы цикл while read i...done на xargs. Если объединить с советом zz, то скрипт должен выглядеть примерно так:
#!/bin/sh
grep -m 1 -o -P 'http://(\w+|\W+|\d+)+' "$1" | xargs gnome-open
ну да, while тут явно не нужен. к тому же и grep не все ссылки будет открывать распознавать. например, https уже он не покажет. я на остальную часть тогда не обратил внимания, т.к. меня %U умилило)) интересно, что это вообще должно значить и где подсмотрено (с знака % в вендах вроде бы переменные начинаются)
https уже он не покажет.
Ага, поэтому вместо хитрого регекспа я бы сделал простенький конвеер. Тогда можно ловить любые ссылки на любые протоколы. Что-то типа такого:
#!/bin/bash
grep -m1 URL "$1" | awk -F "URL=" '{print $2}' | xargs gnome-open
Насколько помню, это Наутилус туда имя файла подставляет, когда дропаешь файл на скрипт или actions запускаешь. Как-то так, я наутилус давно не пользую. Тут дело в том, что %U должно быть в строке для запуска скрипта, данной наутилусу, но никак не в самом скрипте.
%U было подсмотрено вот тут :)
gnome-terminal -e "wget -c --directory-prefix=Загрузки/dnd %U"
Для информации An Unofficial Guide to the URL File Format
Мой быдлокод ниже
Пример
Мой быдлокод ниже
ini_parser()
{
if < $# -lt 2 >; then
echo "Usage: `basename $0` <Section Name> <Parameter> < File >"
exit 1
fi
local SNAME="$1"
local PNAME="$2"
if < -f $3 >; then
local FILE="$3"
else
local FILE="-"
fi
local SP='<<:blank:>>'
local SPS="${SP}*"
local CONVERT_CRLF="s/.$//"
local REMOVE_COMMENT="s/<;#>.*$//"
local LEFT_TRIM="s/^${SPS}//"
local RIGHT_TRIM="s/${SPS}$//"
local DEL_BLANK_LINES="/^${SPS}$/d"
local FILTER="${CONVERT_CRLF};${REMOVE_COMMENT};${LEFT_TRIM};${RIGHT_TRIM};${DEL_BLANK_LINES}"
local SECTION_NAME='.*'
local GET_SECTION="/^\<${SNAME}\>$/,/^\<${SECTION_NAME}\>$/!d"
local DEL_SECTION_NAMES="/^\<${SECTION_NAME}\>$/d"
local RUN="$FILTER;${GET_SECTION};${DEL_SECTION_NAMES};/^${PNAME}${SPS}=/!d;s/^${PNAME}${SPS}=${SPS}//"
sed "${RUN}" $FILE
}
Пример
ini_parser InternetShortcut URL | xargs gnome-open
Тогда уже так:
#!/usr/bin/python
import sys
from ConfigParser import SafeConfigParser, NoSectionError, NoOptionError
try:
section = sys.argv<1>
param = sys.argv<2>
except IndexError:
print 'Usage: %s <section> <parameter> <<filename>>' % sys.argv<0>
sys.exit(1)
cp = SafeConfigParser()
try:
cp.read(sys.argv<3>)
except IndexError:
cp.readfp(sys.stdin)
try:
print cp.get(section, param)
except (NoSectionError, NoOptionError):
pass
Ну теперь осталось ещё переложить на C, и оформить в виде модуля ядра =)
Я к тому, что в питоне уже есть готовый хорошо отлаженный модуль для парсинга ини-файлов, так что написание такого парсера на шеле выглядит немного велосипедно...
Однострочником кстати тоже можно:
python -c 'import ConfigParser as cp; c=cp.SafeConfigParser();c.read("/path/to/file.ini");print c.get("section_name", "param_name")'
подскажите пжс а где взять утилиту или готовый скрипт, чтобы можно было открывать URL файлы, я не знаю Bash, Linux хорошо, чтобы разобраться самостоятельно с этой информацией.Т.е у меня с Windows есть много файлов-ссылок в URL формате, и что теперь с ними делать, чтобы из Linux открывать можно было?
firefox http://localhost/
Пробовали?