シェルスクリプト
使ひ方
特定のファイルを開く
特定のファイルを開く(メニュー)
日附を貼附け
ブラウザのアドレスバーにフォーカス
開いてゐるページのタイトルとURLをコピー
開いてゐるページへのテキストリンク(HTML)をコピー
クリップボード內の文字を置換
HTMLマークアップ
HTMLタグを削除
テキストエディタで編輯中の文章をバックアップ
特定のファイルを抽出して開く
特定のファイルを檢索して削除
指定時間後に音を鳴らす(アラーム)
メールを取得・通知
キーワードもしくは URL を指定したプログラムで開く
ハードウェアの情報を取得
スクリーンショットを撮影し、參照
電卓
附錄:GNU/Linux關聯(メモ)
附錄:GNU/Linux(OS・ソフトウェア)
使ひ方
スクリプトを書いたら、ショートカットに設定しておくと良い
GNOMEデスクトップ:設定 →デバイス →キーボード →キーボードショートカット
スクリプトファイルの開き方(コマンド):bash ドキュメント/日記.sh
動作確認(2021年5月22日現在):
GNU bash, バージョン 5.0.3(1)-release (x86_64-pc-linux-gnu)
grep (GNU grep) 3.3
sed (GNU sed) 4.7
tr (GNU coreutils) 8.30
head (GNU coreutils) 8.30
tail (GNU coreutils) 8.30
xdotool version 3.20160805.1
xclip version 0.13
特定のファイルを開く
nano 日記.txt 食事記録.txt
nano journal_`date +%Y%m`.html
SAVE=~/Docs/life
FILE=$SAVE/journal_$(date '+%Y%m').html
MY_TERM=st
EDITOR=kak
test -d $SAVE || mkdir -p $SAVE && touch $FILE
test -e $FILE || cd $SAVE && cp "$(ls -c | head -n1)" $FILE
$MY_TERM -e $EDITOR $FILE
實行すると cp: -r not specified; omitting directory 'DL'
と出力され、コピーができない(コマンドラインへ入力する分には問題無く動作する)
2022年10月16日:公開
DIR="$HOME/Docs/life "
FILE="journal_$(date +%Y-%m).html "
LATEST="$(find "$DIR" -type f -name 'journal_*.html ' | sort | tail -n1)"
MY_TERM=st
EDITOR=kak
test -z "$LATEST" && echo "ディレクトリかファイルが存在しません " | dzen2 -p 4 -y 30 -bg '#500000 ' -fg '#f0f0f0 ' && exit
echo "$LATEST" | grep "$FILE" || cp "$LATEST" "$DIR/$FILE"
$MY_TERM -e $EDITOR "$DIR/$FILE"
test -z "$LATEST"
:ディレクトリか檢索結果が存在しなければ終了(exit
)。餘計な事はしない
今月のファイルと最新のファイルを比較して、存在の有無を確認する。無ければコピー
find
での正規表現檢索:find $DIR -type f -regextype posix-extended -regex '.*journal_[0-9]{4}-[0-3][0-9]\.htm '
2023年1月2日:公開
2023年1月7日:改訂
DATE="$(date +%F )"
AUTHOR="sinumade "
URL="https://sinumade.net/about#author "
R_MSG="Copyright is waived via CC0 "
R_URL="http://creativecommons.org/publicdomain/zero/1.0/ "
DIR="$HOME/Docs/life/ "
FILE="$DATE.txt "
TERM=st
EDITOR=kak
LINE=6
test ! -d "$DIR" && echo "ディレクトリが存在しません " | dzen2 -p 4 -y 30 -bg '#500000 ' -fg '#f0f0f0 ' && exit
test ! -f "$DIR$FILE" && echo "# $DATE
author: $AUTHOR < $URL>
issued: $DATE
$R_MSG < $R_URL>
" > "$DIR$FILE"
$TERM -e $EDITOR +$LINE "$DIR$FILE"
日記を書くためのスクリプト
テンプレートファイルを用意して、讀込むなり複製するなりした方が樂かも知れない
TMP="template.txt "
test ! -f "$DIR$FILE" && cat "$DIR$TMP" | sed -E "s/^(# |issued: )$/\1 $DATE/g" > "$DIR$FILE"
2023年1月7日:公開
檢索して開く
DIR="$HOME/Docs/work "
WORD="$(zenity --entry --width=400 --height=20 --text="ファイル名(/を含まない): " --title="作業ディレクトリを検索 ")"
PROXY=http://127.0.0.1:8118
SANDBOX="firejail --noprofile "
BROWSER=surf
MY_TERM=st
EDITOR=kak
[ -d "$DIR" ] && [ "$WORD" ] || exit 0
RESULT="$(find "$DIR" -type f -name "*$WORD*" | grep -n "$WORD")"
if [ "$RESULT" ]; then
FILE="$(echo "$RESULT" | dmenu -p '開く ' -l 10 -fn 'monospace-18 ' | sed -E 's/^[0-9]+://g')"
[ "$FILE" ] && [[ "$(echo "$RESULT" | grep "$FILE")" ]] || exit 0
if [[ "$(echo "$FILE" | grep -E '\.(txt|gmi)$')" ]]; then
$MY_TERM -e $EDITOR "$FILE"
elif [[ "$(echo "$FILE" | grep -E '\.html*$')" ]]; then
export http_proxy="$PROXY" && $SANDBOX $BROWSER "$FILE"
else
xdg-open "$FILE"
fi
else
echo "該当なし " | dzen2 -p 4 -y 30 -bg '#500000 ' -fg '#f0f0f0 '
fi
日本語を含む檢索(zenity
)→番號等で指定(dmenu
)。フルパスで表示
if
の濫用かと思ひつつ、良い手が浮ばない
else
が不要なら if
を用ゐる必要は無い
2023年1月7日:else
處理の無い if
を削除し、エラーの元となる結果に對して exit
處理をした。早い段階からエラーの根據を摘み取つておけば、全體の處理も速くなる。想定 (エラー=想定の破壞)を把握しておく事
眞僞値の處理が多いのは、エラー(入力を空にしたり終了したりした時)に對應するため
if [ "$FILE" ] && [[ "$(echo "$RESULT" | grep "$FILE")" ]]; then
:入力が空でないか(檢索結果から選擇してゐるか)確認
2023年1月2日:公開
2023年1月7日:エラー處理、變數名の改訂、對應擴張子の追加
TOC=~/Works/toc.txt
MY_TERM=st
EDITOR=kak
FILE=$(cat $TOC | dmenu -p '開く ' -l 10 -fn 'monospace-18 ' | sed -E 's/^([0-9]+)_.+$/\1/')
if [ "$FILE" ]; then
case "$FILE" in
1) FILE=~/Works/cur/現金出納帳.ods ;;
2) FILE=~/Works/cur/日誌.txt ;;
esac
if [[ $(echo "$FILE" | grep -E '\.(txt|md|asciidoc )$') ]]; then
$MY_TERM -e $EDITOR "$FILE"
else
xdg-open "$FILE"
fi
fi
よく開くファイルを想定したランチャ
目次テキストの形式(一行づつ):1_現金出納帳
GUI ソフトウェアで開くなら xdg-open
だけで良い
2022年10月16日:公開
日附を貼附け
xclip -selection c -o | xclip -selection s
date "+%Y-%m-%d " | tr -d '\n' | xclip -selection c
xdotool key ctrl+v
xclip -selection s -o | xclip -selection c
echo | xclip -selection s
copy-date.sh (2022年1月23日/コピーするのみ)
2022年1月23日:コメントを改訂
2021年5月31日
insert-date.sh (2022年1月23日/名前をcopyとinsertで入替へた)
2022年1月23日:コメントを改訂
2021年5月31日
年月日形式は5行目を+%Y年%-m月%-d日
にする
2021年5月22日:變數の削除を改訂
before:
PRG=""
echo $PRG | xclip -selection s
after:PRG=
echo $PRG | xclip -selection s
unset PRG
after:echo | xclip -selection s
ブラウザのアドレスバーにフォーカス
WINDOW=`xdotool getactivewindow getwindowname`
if [[ `echo $WINDOW | grep -E 'GNU IceCat$ |Tor Browser$ '` ]]; then
xdotool getactivewindow key --clearmodifiers alt+d
else
xdotool getactivewindow key --clearmodifiers F2
fi
unset WINDOW
開いてゐるページのタイトルとURLをコピー
xdotool getactivewindow key --clearmodifiers alt+d ctrl+c Tab
ADD=`xclip -selection c -o`
TITLE=`xdotool getactivewindow getwindowname | sed -E 's/( - )*GNU IceCat$ |( — )*Tor Browser$ //'`
SITEINFO="${TITLE}
${ADD}"
echo "$SITEINFO" | head -c -1 | xclip -selection c
unset ADD
unset TITLE
unset SITEINFO
copy-browse-plain.sh (2022年1月23日)
2022年1月23日:コメントを改訂
2021年5月30日
ウィンドウを特定する場合:
3行目:xdotool search --onlyvisible --class icecat windowactivate --sync key --clearmodifiers alt+d ctrl+c Tab
7行目:TITLE=`xdotool search --onlyvisible --class icecat getwindowname | sed -e 's/( - )*GNU IceCat $//'`
getactivewindow
ではなくselectwindow
(ウィンドウをクリックして特定)を使用しても良い
以前は長く書いてゐたが、變數に出力結果を代入できる事、パイプ(|
)で出力を渡す事ができる事に氣附いて改良した
變數TITLE の代入
before:
TITLE=`xdotool search --onlyvisible --class icecat getwindowname`
echo ${TITLE% - GNU IceCat } | xclip -selection s
TITLE=`xclip -selection s -o`
after:TITLE=`xdotool search --onlyvisible --class icecat getwindowname | sed -e 's/ - GNU IceCat $//'`
クリップボードへの插入と、末尾の改行の削除
before:
echo "$SITEINFO" | xclip -selection c
xclip -selection c -o | head -c -1 | xclip -selection c
after:echo "$SITEINFO" | head -c -1 | xclip -selection c
2021年5月22日:變數の削除を改訂
before:
ADD=""
TITLE=""
SITEINFO=""
after:unset ADD
unset TITLE
unset SITEINFO
2021年5月30日:ブラウザ名直前の區切り( -
、 —
)が無くても動作するやうにした
開いてゐるページへのテキストリンク(HTML)をコピー
xdotool getactivewindow key --clearmodifiers alt+d ctrl+c Tab
ADD=`xclip -selection c -o`
TITLE=`xdotool getactivewindow getwindowname | sed -E 's/( - )*GNU IceCat$ |( — )*Tor Browser$ //'`
LINK="<a href=\"${ADD}\">${TITLE}</a>"
echo "$LINK" | tr -d '\n' | xclip -selection c
unset ADD
unset TITLE
unset LINK
copy-browse-link.sh (2022年1月23日)
2022年1月23日:コメントを改訂
2021年5月30日
以前は長く書いてゐたが、變數に出力結果を代入できる事、パイプ(|
)で出力を渡す事ができる事に氣附いて改良した
クリップボードへの插入と、末尾の改行の削除
before:
echo $LINK | xclip -selection c
xclip -selection c -o | tr -d '\n' | xclip -selection c
after:echo "$LINK" | tr -d '\n' | xclip -selection c
2021年5月22日:變數の削除を改訂
2021年5月30日:ブラウザ名直前の區切り( -
、 —
)が無くても動作するやうにした
クリップボード內の文字を置換
xclip -selection c -o | sed -e 's/価値 /價値 /g; s/真実 /眞實 /g' | xclip -selection c
行頭空け
xclip -selection c -o | sed -E 's/^\s*//g; s/^([^「『(〈《[〔{【‘“〝 ])/ \1/g' | xclip -selection c
copy-text-indent.sh (2023年3月26日)
2023年3月26日:改訂
2022年1月23日:コメントを改訂
2021年5月22日
既存の全角空白は變らないやうに設定
自分の書き癖に合せて改訂
2023年1月2日:大幅改訂。[]
で括れる事に氣附かなかつた
2023年3月26日:s/^\s*//g
で、既存の空白を削除
HTMLマークアップ
EDITOR="st -e kak "
DIR=$HOME/works
HTML=$DIR/preview/fic-source.html
test -d $DIR || exit 0
PLAIN="$(zenity --file-selection --title="テキスト原稿を選んで下さい " --filename=$DIR/ --file-filter='*.txt')" || exit 0
cat "$PLAIN" | sed -E 's/【 /<em>/g; s/】 /<\/em>/g' | \
sed -E 's/| /<ruby>/g; s/(《 )/<rp>\1<rt>/g; s/(》 )/<rp>\1<\/ruby>/g' | \
sed -E 's/^\s*//g; s/^([^「『【《〈([〔{“〝‘ ])/ \1/g' | \
sed -E 's/^/<br>/g; s/^<br>$//g; 1s/^<br>/<p>/' | \
sed -zE 's/\n{3,}/\n\n<hr class="time">\n\n/g; s/(\n{2})<br>/\1<p>/g' > $HTML
$EDITOR $HTML
章區切の無い、掌篇小說本文を想定
記法は、傍點とルビのみ
1行の空白行は、新しい段落(p
要素)としてマークアップ
2行以上の空白行は、話題の區切(hr
要素)としてマークアップ
2023年3月26日:公開
HTMLタグを削除
EDITOR="st -e kak "
DIR=$HOME/works
HTML=$DIR/preview/fic-plain.html
test -d $DIR || exit 0
HTML="$(zenity --file-selection --title="HTML原稿を選んで下さい " --filename=$DIR/ --file-filter='*.html *.htm')" || exit 0
cat "$HTML" | sed -E 's/<em>/【 /g; s/<\/em>/】 /g' | \
sed -E 's/<ruby>/| /g; s/<rp>(《 )<rt>/\1/g; s/<rp>(》 )<\/ruby>/\1/g' | \
sed -E 's/^<(p|br)>//g' | \
sed -E 's/^<hr class="time">$/\n* * * \n/g' > $PLAIN
$EDITOR $PLAIN
章區切の無い、掌篇小說本文を想定
記法は、傍點とルビのみ
話題の區切(hr
要素)はアスタリスク(*)に置換してゐるが、何でも良い
2023年3月26日:公開
テキストエディタで編輯中の文章をバックアップ
xclip -selection c -o | xclip -selection s
xdotool getactivewindow key --clearmodifiers ctrl+a ctrl+c click --clearmodifiers 1
xclip -selection c -o > ドキュメント/`date +monokaki_%FT%T.txt`
xclip -selection s -o | xclip -selection c
echo | xclip -selection s
一行目をタイトルにする
xclip -selection c -o | xclip -selection s
xdotool getactivewindow key --clearmodifiers ctrl+a ctrl+c click --clearmodifiers 1
LINE=`xclip -selection c -o | grep -v -E '^( | )*$' | grep -E '.+' | head -n 1 | sed -E 's/\\\/-/g; s/\//-/g; s/\^|\\$|\||\*|\+|\?|\(|\)|\{|\}|\[|\]//g; s/^$/無題 /g'`
xclip -selection c -o > ドキュメント/`date +${LINE}_%FT%T.txt`
xclip -selection s -o | xclip -selection c
echo | xclip -selection s
unset LINE
work-text-editor-backup-title.sh (2022年1月23日)
2022年1月23日:コメントを改訂
2021年5月22日
空白(改行及び空白文字のみの)行以外の一行目をタイトルにする
本當に一行目のみを對象:7行目:LINE=`xclip -selection c -o | head -n 1 | sed -E 's/\\\/-/g; s/\//-/g; s/\^|\\$|\||\*|\+|\?|\(|\)|\{|\}|\[|\]//g; s/^( | )*$/無題 /g'`
特定のファイルを抽出して開く
タイムスタンプが新しいファイル
LATEST=`find -name ドキュメント/monokaki_*-*-*T*:*:*.txt | tail -n 1`
gedit ${LATEST}
unset LATEST
work-text-editor-backup-open.sh (2022年1月23日)
2022年1月23日:コメントを改訂
2021年5月30日
バックアップファイル(何らかの形で日附や連番がある)を想定
番號だけなら(タイムスタンプをファイル名の直前に附加して逆順に整列、一行目を抽出):3行目:LATEST=`find ドキュメント/monokaki_*.txt -type f -printf "%TY-%Tm-%TdT%TH:%TM:%TS-%p\n" | sort -r | head -n 1`
2021年5月30日:find
コマンドに-name
オプションを追加
特定のファイルを檢索して削除
find -name ドキュメント/monokaki_*-*-*T*:*:*.txt -type f -exec sed -i -z -E 's/.|\n//g' {} \; -exec rm {} \;
最新以外のバックアップファイルを削除
LATEST=`find -name ドキュメント/無題_*-*-*T*:*:*.txt | tail -n 1`
OLDER=`find -name ドキュメント/無題_*-*-*T*:*:*.txt | grep -v ${LATEST}`
sed -i -z -E 's/.|\n//g' ${OLDER}
rm ${OLDER}
unset LATEST
unset OLDER
指定時間後に音を鳴らす(アラーム)
sleep
を利用
notify-send -t 1000 Set!
sleep 30m
bash ~/timer-alarm-sound.sh
~/timer-alarm-sound.sh
:
echo "〆" `date +%H:%M` | dzen2 -e 'onstart=grabkeys;key_a=exit' -p -h 500 -y 250 -bg '#168e5e' -fg '#effff0' -fn 'GenEi M Gothic v2-50' &
mocp -l /usr/share/sounds/freedesktop/stereo/complete.oga
sleep 1
mocp -p
開始の合圖は notify-send
ではなく、音→時間指定→音でワンループさせるのもあり
mocp
で音樂を流してゐる事を想定。起動させてゐないなら mocp -S
なり mocp -x
なりで始めたり終らせたりする
2022年1月23日:通知を追加。notify-send
より dzen2
の方が汎用性が高い
at
を利用
at now +30minutes -f ~/timer-alarm-sound.sh
notify-send -t 1000 Set!
~/timer-alarm-sound.sh
:
echo "〆" `date +%H:%M` | dzen2 -e 'onstart=grabkeys;key_a=exit' -p &
mocp -l /usr/share/sounds/freedesktop/stereo/alarm-clock-elapsed.oga
sleep 2
mocp -p
at
を利用(2022年3月26日)
alarm.sh
:
script=$HOME/.config/ShellScript
exec="urxvt -e bash $script/alarm-notify.sh"
time="$(echo -e '60 \n30 \n15 ' | dmenu -p '時間(分)' -fn 'monospace-18 ')"
notify_time_call=8
notify_time_warn=3
notify_geo_call="120x40-125+30 "
notify_w_call=120
notify_y_call=38
notify_y_warn=30
notify_bg_call="#168e5e "
notify_bg_warn="#500000 "
notify_fg_call="#effff0 "
notify_fg_warn="#f0f0f0 "
notify_font_call="ChicagoFLF-19 "
if [ $time ] && [[ $(echo $time | grep -E '^[0-9]+$') ]]; then
echo -e "$(date +%H:%M)\n( $time m )\n$(date +%H:%M -d "$time minutes")" | dzen2 -e 'onstart=uncollapse' -p $notify_time_call -l 2 -sa c -geometry "$notify_geo_call" -w $notify_w_call -h $notify_y_call -bg "$notify_bg_call" -fg "$notify_fg_call" -fn "$notify_font_call" &
echo "$exec" | at now + $time minutes
elif [[ $(echo $time | grep -E '[^0-9]') ]]; then
echo "数字のみで時間を指定して下さい " | dzen2 -p $notify_time_warn -y $notify_y_warn -bg "$notify_bg_warn" -fg "$notify_fg_warn"
else
echo "アラームは設定されませんでした " | dzen2 -p $notify_time_warn -y $notify_y_warn -bg "$notify_bg_warn" -fg "$notify_fg_warn"
fi
時間の指定をプロンプトから指定、取得
echo "hoge" | dzen2
が at -f hoge.sh
では實行できないので、ターミナルエミュレータから實行する事に
alarm-notify.sh
:
echo "〆 $(date +%H:%M)" | dzen2 -e 'onstart=grabkeys;key_Escape =exit' -p -h 500 -y 250 -bg '#168e5e ' -fg '#effff0 ' -fn 'GenEi M Gothic v2-50 '
時刻指定
script=$HOME/.config/ShellScript
exec="urxvt -e bash $script/alarm-notify.sh "
time="$(date '+%H:%M' | dmenu -p 'HH:MM' -fn 'monospace-18') "
notify_time_call=8
notify_time_warn=3
notify_geo_call="120x40-125+30 "
notify_w_call=120
notify_y_call=38
notify_y_warn=30
notify_bg_call="#168e5e "
notify_bg_warn="#500000 "
notify_fg_call="#effff0 "
notify_fg_warn="#f0f0f0 "
notify_font_call="ChicagoFLF-19 "
if [ $time ] && [[ $(echo $time | grep -E '^[0-2][0-9]:[0-5][0-9]$') ]]; then
min=$(expr \( $(date -d $time '+%s') - $(date -d $(date '+%H:%M') '+%s') \) / 60)
if [ $min -gt 0 ]; then
echo -e "$(date '+%H:%M')\n( $min m )\n$time" | dzen2 -e 'onstart=uncollapse' -p $notify_time_call -l 2 -sa c -geometry "$notify_geo_call" -w $notify_w_call -h $notify_y_call -bg "$notify_bg_call" -fg "$notify_fg_call" -fn "$notify_font_call" &
echo "$exec" | at $time today
else
echo "未来の時刻を指定して下さい " | dzen2 -p $notify_time_warn -y $notify_y_warn -bg "$notify_bg_warn" -fg "$notify_fg_warn"
fi
else
echo "アラームは設定されませんでした " | dzen2 -p $notify_time_warn -y $notify_y_warn -bg "$notify_bg_warn" -fg "$notify_fg_warn"
fi
アラームを削除
job="$(atq)"
notify_time=2
notify_time_warn=4
notify_y=30
notify_bg_warn="#500000 "
notify_fg_warn="#f0f0f0 "
if [ "$job" ]; then
jobnum="$(echo "$job" | sed -E 's/^([0-9]+)\s+(Mon|Tue|Wed|Thu|Fri|Sat|Sun) /\1_/g' | sed -E 's/([0-2][0-9]:[0-5][0-9]):[0-5][0-9]/\1/g' | sed -E 's/( [0-2][0-9]:[0-5][0-9]) [0-9]{4} [\ 0-9a-zA-Z]+$/\1/g' | sed -E 's/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [0-3][0-9] //g' | dmenu -p '削除するジョブ ' -l 10 -fn 'monospace-18 ')"
if [[ $(echo "$jobnum" | grep -E '^([0-9]+)_[0-2][0-9]:[0-5][0-9]$') ]]; then
jobnum=$(echo "$jobnum" | sed -E 's/^([0-9]+)_[0-2][0-9]:[0-5][0-9]$/\1/')
atrm "$jobnum" && echo "ジョブを削除 " | dzen2 -p $notify_time -y $notify_y
else
echo "ジョブは削除されませんでした " | dzen2 -p $notify_time_warn -y $notify_y -bg "$notify_bg_warn" -fg "$notify_fg_warn"
fi
else
echo "ジョブはありません " | dzen2 -p $notify_time -y $notify_y
fi
メールを取得・通知
MAIL_STATUS=`mpop -a | sed -E 's/@.+?(:)/\1/g; s/no messages/0/g; s/new:.+?total: ([0-9]+?) message.+?$/\1/g; s/retrieving message.+?$//g' | sed -zE 's/:\n/: /g; s/\n/ -- /g; s/( -{2} ){2,}/\1/g; s/ -{2} $//g; s/$/\n/g'` && echo " ${MAIL_STATUS}" | dzen2 -e 'onstart=grabkeys;key_a =exit' -ta l -p -geometry '300x45-305+30 ' -bg '#afaf5f ' -fg '#000000 ' -fn 'ChicagoFLF ' && unset MAIL_STATUS &
ユーザが確認(キー入力)してから通知を終了するやうにした方が親切かも知れない
時間指定で終了なら -e 'onstart=grabkeys;key_a=exit'
を削除して -p
の後に秒數を追加する
キーが a
なのは、ホームポジションから無理無く押せるから
元々は i3
の設定ファイルに仕込んでゐたものだが、;
と ,
を變數の値に入れるとエラーが出るため、シェルスクリプトで參照する事にした(單純だが無難な解決方法)
2022年1月23日:公開
MAIL_STATUS="$(mpop -a | sed -E 's/@.+?(:)/\1/g; s/no messages/0/g; s/new:.+?total: ([0-9]+?) message.+?$/\1/g; s/retrieving message.+?$//g' | sed -zE 's/:\n/: /g; s/\n/ -- /g; s/( -{2} ){2,}/\1/g; s/ -{2} $//g; s/$/\n/g')"
if [ "$MAIL_STATUS" ]; then
echo " $MAIL_STATUS" | dzen2 -e 'onstart=grabkeys;key_a =exit' -ta l -p 10 -geometry '300x45-305+30 ' -bg '#afaf5f ' -fg '#000000 ' -fn 'ChicagoFLF '
else
echo "メールは取得されませんでした " | dzen2 -p 4 -y 30 -bg '#500000 ' -fg '#f0f0f0 '
fi
通知の表示時間を追加
キャンセル時の通知を追加
2022年3月26日:公開
キーワードもしくは URL を指定したプログラムで開く
ws="i3-msg workspace"
ws_pr="Private "
sandbox="firejail --noprofile --hosts-file="~/.blockhosts ""
proxy_http="export http_proxy="http://127.0.0.1:8118 ""
locale="export LC_ALL="C ""
timezone="export TZ="UTC ""
browser="surf"
browser_class="$browser"
browser_xprop=""_SURF_GO""
brwsr_tor="$HOME/tor-browser_ja/Browser/start-tor-browser"
brwsr_tor_class="Tor Browser"
browser2="badwolf"
input="$(zenity --entry --width=400 --height=20 --text="移動: " --title="移動先を入力 " | sed -E 's/(\s){2,}/\1/g; s/^\s//g; s/\s$//g')"
if [ "$input" ]; then
searchwords="$(echo "$input" | sed -E 's/^(wm|a|hp) (.+)$/\2/g')"
case "$input" in
"wm ")
input="https://web.archive.org/ " ;;
"wm "?*)
input="https://web.archive.org/web/*/$searchwords " ;;
"man ")
input="https://manpages.debian.org/ " ;;
"man "?*)
input="https://dyn.manpages.debian.org/jump?q=$searchwords " ;;
"a ")
input="https://wiki.archlinux.jp/ " ;;
"a "?*)
input="https://wiki.archlinux.jp/index.php?search=$searchwords&title=%E7%89%B9%E5%88%A5%3A%E6%A4%9C%E7%B4%A2&fulltext=%E6%A4%9C%E7%B4%A2 " ;;
"hp ")
input="https://www.hyperbola.info/packages/ " ;;
"hp "?*)
input="https://www.hyperbola.info/packages/?q=$searchwords " ;;
"kiz ")
input="https://kiz.sinumade.net/ " ;;
"valid ")
input="https://validator.w3.org/#validate-by-upload " ;;
esac
if [[ $(echo "$input" | grep -E '^https://validator\.w3\.org ') ]]; then
brwsr_tor_wid="$(xdotool search --class "$brwsr_tor_class" | tail -n 1)"
if [ "$brwsr_tor_wid" ]; then
brwsr_tor_wid_v="$(xdotool search --onlyvisible --class "$brwsr_tor_class")"
if [ "$brwsr_tor_wid_v" ]; then
xdotool windowactivate $brwsr_tor_wid_v && fcitx-remote -c && sleep 0.1 && xdotool key --clearmodifiers ctrl+t type "$input" && xdotool key --clearmodifiers Return
else
xdotool windowactivate $brwsr_tor_wid && fcitx-remote -c && sleep 0.1 && xdotool key --clearmodifiers ctrl+t type "$input" && xdotool key --clearmodifiers Return
fi
else
$sandbox $brwsr_tor "$input"
fi
elif [[ $(echo "$input" | grep -E '^https://(web\.archive\.org|h-node\.org) ') ]]; then
$ws $ws_pr && $locale && $timezone && $proxy_http && firejail --noprofile $browser2 "$input"
else
echo "$input" | grep -E '^[^ :/]+\.[^ ]+$' && input="$(echo "$input" | sed -E 's/^(.+)$/https:\/\/\1/g')"
echo "$input" | grep -E '^gemini://' && input="$(echo "$input" | sed -E 's/^gemini:\/\//https:\/\/portal.mozz.us\/gemini\/ /g')"
echo "$input" | grep -E '^gopher://' && input="$(echo "$input" | sed -E 's/^/https:\/\/gopher.floodgap.com\/gopher\/gw? /g')"
echo "$input" | grep -E '^https*://' || input="$(echo "$input" | sed -E 's/^/https:\/\/www.mojeek.com\/search?q= /g')"
$proxy_http && $sandbox $browser "$input"
fi
fi
一種のランチャ
元々は surf のために書いたスクリプトだが、どのプログラムでも使へる
config.h
に書いても良いが、スクリプトにするメリットとしては、編輯後にコンパイルする必要が無い事
dmenu
は fcitx
が使へないため、zenity
を使用
sed -E 's/^\s+//g; s/\s+$//g'
:連續した空白を削除するのがポイント。意外と連打してしまふ事があるので
2022年3月26日:sed -E 's/(\s){2,}/\1/g; s/^\s//g; s/\s$//g'
:より確實な處理へ改訂
if [[ $(echo "$input" | grep -E '\S') ]]; then
:非空白文字列のみを對象とする。キーワード(URL)の入力をキャンセルした場合には何もしない
2022年3月26日:if [ "$input" ]; then
:變數の判定を簡潔にした
sed -E 's/^(.+\.(com|info|net|org|(.+\.)*jp)\/*)$/https:\/\/\1/g; s/^(https*:\/\/){2,}/\1/g'
:簡單なドメインのフォールバック。各檢索エンジンでドメインを檢索するために、檢索キーワードの後 に記述。エイリアス(短縮名)の直前なのは、エイリアス置換の出力結果がドメイン置換の條件に該當するため(二重に置換しても害は無いが)
2022年3月26日:sed -E 's/^([^\.]+\..+)$/https:\/\/\1/g; s/^(https*:\/\/){2,}/\1/g'
:ドメインの判定を簡潔にした
echo "$input" | grep -E '^https*://' || input="$(echo "$input" | sed -E 's/^/https:\/\/www.mojeek.com\/search?q=/g')"
:HTTP で始まらないキーワードは Web 檢索
檢索キーワードのフォールバックを設定しても良いかも知れないが(この例だと a
で ArchWiki のトップページに置換するなど)、殆どのサイトはエラーページを用意してゐるので不要だと判斷
2022年3月26日:case
の導入に伴ひ、フォールバックを設定
Tor Browser のフォールバックはよく解らない。起動してゐるウィンドウは一つなのだが、class
で檢索すると複數出てくる。tail
で無理矢理落し込んだ。ウィンドウが上手く指定できないなら、URL をクリップボードに格納しても良い(ブラウザの操作は手動)
存在するウィンドウを探し、タブを開くショートカットを實行して URL を入力してゐるだけ
ウィンドウが無いなら新しく開く
Firefox 系のブラウザは --no-remote
オプションで開き、獨自の class
を當ててゐる事が前提
ちなみに、xdotool type
は日本語も可能。入力時間は確保した方が良いと思ふが(sleep
などで)
2022年5月29日:改訂
echo "$input" | grep -E '^[^ :/]+\.[^ ]+$' && input="$(echo "$input" | sed -E 's/^(.+)$/https:\/\/\1/g')"
:ドメイン/プロトコル無しのURIを補完
echo "$input" | grep -E '^gemini://' && input="$(echo "$input" | sed -E 's/^gemini:\/\//https:\/\/portal.mozz.us\/gemini\//g')"
:GeminiコンテンツはHTTPプロキシを利用
echo "$input" | grep -E '^gopher://' && input="$(echo "$input" | sed -E 's/^/https:\/\/gopher.floodgap.com\/gopher\/gw?/g')"
:GopherコンテンツはHTTPプロキシを利用
2022年4月3日:改訂
以下を削除:
$browser_ua
:ブラウザの設定で UA を變更できると氣附いたため
$brwsr_pr_class
$brwsr_js
$brwsr_js_class
以下を追加:
$proxy_http
$locale
$timezone
$browser2
2022年3月26日:改訂
$HOME
を追加
$browser_ua
を追加。特定の UA で surf
を起動するやうにした
$searchwords
を追加。檢索語を取得
sed
での置換を case
での置換へ變更。一致文字列に空白がある時は、引用符で圍ふ事
URL の檢索文字列を改訂。ドメイン單位にし、簡潔にした
2022年2月13日:公開
ハードウェアの情報を取得
SAVE=/tmp/lshw.txt
sudo lshw | xclip -selection p && \
test -e $SAVE && chmod 644 $SAVE ; \
xclip -selectio p -o | grep 'description' | sed -E 's/^\s{4}//g; s/\s{3}/ - /g; s/description:\s//g' | \
sed '1i ============ TOC ============ ' | \
sed '$a ============ /TOC ============\n ' > $SAVE && \
xclip -selection p -o >> $SAVE && \
chmod 444 $SAVE ; \
$MY_TERM -e $EDITOR $SAVE
SAVE=/tmp/hwinfo.txt
sudo hwinfo | grep -A 2000 'end debug info' | xclip -selection p && \
test -e $SAVE && chmod 644 $SAVE ; \
xclip -selectio p -o | grep -E '^[0-9]+:' | sed -E 's/^([0-9]+: )[a-zA-Z]+ [0-9a-z\.]+: [0-9]{4,5} /\1/g' | \
sed '1i ============ TOC ============ ' | \
sed '$a ============ /TOC ============\n ' > $SAVE && \
xclip -selection p -o | sed '/end debug info/d' >> $SAVE && \
chmod 444 $SAVE ; \
$MY_TERM -e $EDITOR $SAVE
hardinfo
が思ひの外賴りにならなかつたので、コマンドラインで解決してみた
lshw
, hwinfo
いづれも項目が列擧されてゐるため、目次が作り易い
複數行の插入の仕方が分らないため、クリップボードを利用して順番に出力してゐる
sudo hwinfo --log $SAVE --all
を利用しないのはそのため
sudo lshw -html
で出力されるのは XHTML。內容を確認するだけならプレーンテキストの方が見易い
2022年10月16日:公開
スクリーンショットを撮影し、參照
SAVE=/tmp/screenshots
test -d $SAVE || mkdir -p $SAVE ; cd $SAVE && scrot '%Y-%m-%d_%H%M%S_$wx$h.png' -e 'mupdf $f'
スクリーンショットは以下の手順を追ふ事が多いので、それを簡略化
撮影
クリップボードへコピー
畫像エディタを開く
貼附
2022年10月16日:公開
電卓
SAVE=/tmp/calc.txt
WIN_W=300
WIN_H=110
EXP_TTL="電卓 "
EXP_MSG="式: "
ANS_TTL="計算結果 "
QST_MSG="式のエラーかも?: "
EXP="$(zenity --entry --text="$EXP_MSG" --title="$EXP_TTL" --width=$WIN_W --height=$WIN_H)"
while [ "$EXP" ]; do
ANS=$(echo "scale=3; $EXP" | bc | sed -E 's/^(-{0,1})(\.)/\10\2/; s/\.0{3}$//; s/(\.[1-9]{1,2})0{1,2}$/\1/g; /\.[0-9]{4,}/s/(\.[1-9]{3})[0-9]+/\1/')
if [[ $(echo $ANS | grep -E '^-{0,1}[\.0-9]+$') ]]; then
if [[ $(echo $ANS | grep -E '[0-9]{4,}') ]]; then
ANS=$(echo $ANS | sed -E 's/([0-9]{3})(\.[0-9]{1,3})*$/,\1\2/')
while [[ $(echo $ANS | grep -E '[0-9]{4,}') ]]; do
ANS=$(echo $ANS | sed -E 's/([0-9]{3},)/,\1/')
done
fi
test -e $SAVE && chmod 644 $SAVE
echo -e "\n$EXP\n= $ANS" >> $SAVE
chmod 444 $SAVE
EXP="$(zenity --entry --text="$EXP\n= $ANS" --entry-text="$(echo $ANS | sed 's/,//g')" --title="$ANS_TTL" --width=$WIN_W --height=$WIN_H)"
else
EXP="$(zenity --entry --text="$QST_MSG\n$EXP\n= $ANS" --entry-text="$(echo $ANS | sed 's/,//g')" --title="$ANS_TTL" --width=$WIN_W --height=$WIN_H)"
fi
done
bc
のエラー處理の仕方が分らないため、四則演算(+-*/)のみ
數字と計算記號以外(及び行頭・行末の記號)は入力フォームに戾る(ループ)→エラーのパターンを考へるのも面倒なので取止め。それよりも計算結果に對する處理で解決した方が良ささうだ
bc
のエラーはターミナルでは出力されるが、パイプだと空白を渡してゐる:
EXP="$(zenity --entry --text="$QST_MSG\n$EXP\n= $ANS" --entry-text="$(echo $ANS | sed 's/,//g')" --title="$ANS_TTL" --width=$WIN_W --height=$WIN_H)"
:四則演算の計算結果に當て嵌まらなかつた時の處理をした
視認性のために、3桁區切りでカンマを附與(連續した4桁が無くなるまでループ)
連續で計算するために、計算結果と共に入力フォームを起動してゐる(入力文字が無くなるまでループ)
--entry-text
オプションで數値の持越し、コピーをし易くしてゐる
/\.[0-9]{4,}/s/(\.[1-9]{3})[0-9]+/\1/
:式の數値は scale
値を無視して計算(出力)されるため處理
ログファイルがある事で計算を追へる
echo $ANS
が澤山あり、もつと賢いやり方があるのだと思ふが、用は足せるのでこれで滿足しておく
2022年10月16日:公開
編:絲 公開:2021年5月22日 更新:2023年3月26日 適用:CC0 [著作權抛棄](第三者の著作物を除く )