プログラム内で次のコマンドを実行すると、小さなプログラムを書くのに問題があります。
gsettings get org.gnome.desktop.background picture-uri
私は得る:
'file:///home/thamara/.config/variety/Favorites/wallpaper-2448037.jpg'
しかし、これは次のようになります。
/home/thamara/.config/variety/Favorites/wallpaper-2448037.jpg
それ以外の場合、プログラムは実行されません。誰でも私を助けることができますか?
プログラム:
#!/bin/bash
## Blogry for GDM - Blurs your current wallpaper and puts it on your loginscreen
## Some Settings
effect='0x8' # Change this to anything you like http://www.imagemagick.org/Usage/blur/
save='~/Pictures/blur.jpg'
## Step one - getting the current wallpaper
dir=$(gsettings get org.gnome.desktop.background picture-uri)
## Step two - Blurring the wallpaper
convert $dir -blur $effect -blur $effect -blur $effect $save
## Step three - exit (Since GDM automatically loads the new wallpaper there is no need for seting it.)
exit 0
## Links:
# http://www.imagemagick.org/Usage/blur/
答え1
コマンドの出力がgsettings
一致します。GVariant テキスト構文。このパラメータはひも、一重引用符で印刷します。
引用符を削除する必要があります。
dir_uri=$(gsettings get org.gnome.desktop.background picture-uri |
sed "s/^'//; s/'\$//; s/\\\\\\(.\\)/\\1/")
これによりURIが得られます。ファイル名に特殊文字が含まれていない場合は、先頭file://
(file:
)のみを削除してください。
dir=$(gsettings get org.gnome.desktop.background picture-uri |
sed "s~^'file://~~; s~'\$~~")
答え2
Ubuntu 12.10でこのコマンドを実行すると、次の結果が表示されます。
$ dir=$(gsettings get org.gnome.desktop.background picture-uri)
$ echo $dir
'file:///usr/share/backgrounds/warty-final-ubuntu.png'
次のように保存された値をクリーンアップします$dir
。
$ dir="${dir/file:\/\//}"
$ echo $dir
'/usr/share/backgrounds/warty-final-ubuntu.png'
file://
これにより、文字列が最初から切り捨てられます。他の結果が表示されたら、この設定を変更できます。あなたの場合:
$ dir="${dir/\/\//}"
詳細
上記はパターン置換を使用して${var/pattern/}
変数からパターンを削除します。pattern
$var
代替
@jthillはまた、Bashの「一致パターンプレフィックスの削除」表記を使用する良い提案をしました。私の考えでは、理解するのは少し難しいですが、同じように効果的です。
はい
$ dir="\'${dir#\'file://}"
\'file://
上記は、からプレフィックスを削除し、チェックマークに置き換え、残り$dir
は'
。$dir
'file://
バッシュのマニュアルページ
Bashのこれらの機能についてもっと知りたい場合は、そうすることをお勧めします。上記で使用した関数です。
Bashのマニュアルページから
${parameter#word}
${parameter##word}
Remove matching prefix pattern. The word is expanded to produce a
pattern just as in pathname expansion. If the pattern matches the
beginning of the value of parameter, then the result of the
expansion is the expanded value of parameter with the shortest
matching pattern (the ``#'' case) or the longest matching pattern
(the ``##'' case) deleted. If parameter is @ or *, the pattern
removal operation is applied to each positional parameter in turn,
and the expansion is the resultant list. If parameter is an array
variable subscripted with @ or *, the pattern removal operation is
applied to each member of the array in turn, and the expansion is the
resultant list.
${parameter/pattern/string}
Pattern substitution. The pattern is expanded to produce a pattern
just as in pathname expansion. Parameter is expanded and the longest
match of pattern against its value is replaced with string. If
pattern begins with /, all matches of pattern are replaced with
string. Normally only the first match is replaced. If pattern
begins with #, it must match at the beginning of the expanded value
of parameter. If pattern begins with %, it must match at the end of
the expanded value of parameter. If string is null, matches of
pattern are deleted and the / following pattern may be omitted.
If parameter is @ or *, the substitution operation is applied to each
positional parameter in turn, and the expansion is the resultant
list. If parameter is an array variable subscripted with @ or *, the
substitution operation is applied to each member of the array in
turn, and the expansion is the resultant list.
フォローアップ質問#1
OPは以下のコメントで次の質問をしました。
今、次の問題に直面しました。 「/home/thamara/.config/variety/Downloaded/wallbase_type_all_order_random_nsfw_100_board_1/wallpaper-2249773.jpg」イメージを開くことができません。
気づいたら、問題は文字列の末尾に2つのティックがあることです。これがなぜそこにあるのかはわかりませんが、次のティックを削除するには、以前にsed
提供した代替コマンドの直後にこのコマンドを使用できます。 Bashの交換機能を使用して、最後に2つの単一ティックを処理する方法を見つけることができません。
dir=$(echo "$dir" | sed "s/''/'/")
はい
$ echo "$dir"
'/home/thamara/.config/variety/Downloaded/wallbase_type_all_order_random_nsfw_100_board_1/wallpaper-2249773.jpg''
$ dir=$(echo "$dir" | sed "s/''/'/")
$ echo "$dir"
'/home/thamara/.config/variety/Downloaded/wallbase_type_all_order_random_nsfw_100_board_1/wallpaper-2249773.jpg'
答え3
//
ファイル名の先頭にある余分な2つを削除し、''
奇妙なことにファイル名の末尾にあるものを削除したい場合は、次のようにしますsed
。
dir=$(gsettings get org.gnome.desktop.background picture-uri|sed -e 's/\/\/\//\//' -e "s/'//g; s/^/'/; s/$/'/")
これにより、無効なインスタンスまたは重複エントリが置き換えられ、///
削除されます。最後に、ファイル名にスペースが含まれている場合は、行の先頭と末尾にスペースを追加してファイル名を適切にカプセル化します。このソリューションは少し長いですが、作業を正しく実行する必要があります。/
'
'
私も何かを鳴らすでしょう持続可能な開発管理言及して言うと、私が走ったとき:
gsettings get org.gnome.desktop.background picture-uri
私が得た結果は次の形式です。
'file:///usr/share/backgrounds/warty-final-ubuntu.png'