Как я запускаю скрипт, когда я переключаюсь между раскладками клавиатуры

По умолчанию wget пишет в файл, имя которого является последним компонентом URL, который Вы передаете ему. Много серверов перенаправляют URL как http://www.url1.com/app?q=123&gibb=erish&gar=ble к другому URL с привлекательным именем файла как http://download.url1.com/files/something.pdf. Можно сказать wget использовать имя от перенаправленного URL (т.е. something.pdf) вместо app?q=123&gibb=erish&gar=ble путем передачи --trust-server-names опция. Это не режим по умолчанию, потому что, если используется небрежно, он мог бы привести к перезаписи непредсказуемого имени файла в текущем каталоге; но если Вы доверяете серверу или работаете в каталоге, содержащем никакие другие драгоценные файлы, --trust-server-names обычно правильная вещь использовать.

Некоторые серверы используют a Content-Disposition заголовок вместо перенаправления для определения имени файла. Передайте --content-disposition опция заставить wget использовать это имя файла.

Таким образом:

wget --content-disposition --trust-server-names -i list_of_urls

Если Вы все еще не получаете привлекательные имена файлов, можно хотеть указать собственное. Предположим, что у Вас есть файл, содержащий строки как

http://www.url1.com/app?q=123&gibb=erish&gar=ble foo.pdf
http://www.url2.com/app?q=111&wha=tcha&mac=allit bar.txt

Чтобы заставить wget загрузить файлы на указанные имена файлов, принимая нет никаких пробельных символов в URL или в именах файлов:

err=0
while read -r url filename tail; do
  wget -O "$filename" "$url" || err=1
done <list_of_urls_and_file_names

err переменная содержит 0, если все загрузки успешно выполнились и 1 иначе, Вы можете return $err если Вы помещаете этот отрывок в функцию или exit $err если Вы помещаете этот отрывок в строку.

Если Вы не хотите указывать что-нибудь кроме URL, и Вы не можете получить хорошие имена от сервера, можно предположить тип файла и попытаться получить, по крайней мере, значимые расширения.

err=0
n=1
while read -r url; do
  if wget -O tmpfile "$url"; then
    ext=data
    case $(file -i tmpfile) in
      application/pdf) ext=pdf;;
      image/jpeg) ext=jpg;;
      text/html) ext=html;;
      text/*) ext=txt;;
    esac
    mv tmpfile "$n.$ext"
  else
    err=1
  fi
  n=$((n+1))
done

Добавьте другие типы, как желаемый. Если Ваш file команда не имеет -m опция, пропустите его и проверьте что file возвраты в Вашей системе для типов файлов Вы интересуетесь. Если у Вас есть файл /etc/mime.types в Вашей системе можно считать ассоциации типов MIME к расширениям от него вместо того, чтобы предоставить собственный список:

n=1
while read -r url; do
  if wget -O tmpfile "$url"; then
    mime_type=$(file -m tmpfile)
    ext=$(awk "$1 == \"$mime_type\" {print \$2; exit} END {print \"data\"}" /etc/mime.types)
    mv tmpfile "$n.$ext"
  else
    err=1
  fi
  n=$((n+1))
done
7
09.10.2013, 19:48
3 ответа

Я сделал бы это наоборот, запустил бы скрипт, который изменяет расположение. Тем путем можно сделать что-либо еще, что Вы хотите с тем же сценарием. К сожалению, довольно трудно узнать Вас текущая раскладка клавиатуры. Я не нашел подхода, который работает на все методы переключения расположения. По некоторым причинам существует различие, если Вы переключаетесь с setxkbmap или через ярлыки GUI.

Так, мое обходное решение должно всегда переключать использование setxkbmap. У меня есть сценарий, который звонит setxkbmap и я связал тот сценарий с ярлыком в моей настольной среде так, чтобы я мог переключиться легко. Пример ниже для греческого языка и американских разметок, необходимо будет изменить его для установки установке:

#!/usr/bin/env bash
key=`xmodmap -pke | grep -w "59" | awk '{print \$NF}'` 
## If this is the "us" layout, that will return "less"
if [ $key == "less" ]; then
    setxkbmap gr
    ## Add other things to be done here
else
    setxkbmap us
    ## Add other things to be done here
fi
0
27.01.2020, 20:19
  • 1
    Спасибо за Ваше усилие, но это недалеко от моего сценария. Единственная разница: индикатор клавиатуры теперь появляется, но только с одним единственным расположением. И да..., если будет способ определить текущую раскладку клавиатуры (не все они или сначала от них, поскольку я видел в других местах) будет хорошо... –  Radu Rădeanu 09.10.2013, 20:44
  • 2
    @RaduRădeanu, который я знаю, я попробовал загрузки методов, но они не последовательны. Сценарий в моем ответе просто отключает индикатор клавиатуры на моем DE, таким образом, это еще хуже. Это - просто единственный способ, которым я знаю для запущения скрипта при изменении разметок. Я не думаю, что возможно при использовании переключателя расположения GUI. Действительно сообщите мне, находите ли Вы лучшее решение хотя! –  terdon♦ 09.10.2013, 21:01

dconf watch может использоваться в качестве получателя события, пример (в Ubuntu 13.10/14.04):

dconf watch /org/gnome/desktop/input-sources/current | xargs -L 2 sh -c "echo kbd layout changed" &
4
27.01.2020, 20:19
  • 1
    К сожалению, это больше не работает с гномом 3.18 (я думаю, что это имеет отношение к этому так, это влияет на более ранние выпуски также) –  don_crissti 19.02.2016, 13:49
gsettings monitor org.gnome.desktop.input-sources mru-sources \
        | xargs -L1 bash -c 'source /path/to/your/script.sh'
0
06.05.2020, 19:05

Теги

Похожие вопросы