シェルスクリプト総合@LINUX Part5 at LINUX
[2ch|▼Menu]
1:1様
09/04/03 22:17:43 0qFlvOW9
UNIX板のスレを見ている方も多数おられるかと思いますが、
まあそれはそれとして、BASHウゼーとか言われる心配なく
平和にLINUX的スクリプト談義しましょうよ。

初めての自作スクリプト、自信ないから見てください。な初心者から
トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで
いろいろな人に参加して頂けると嬉しいです。

perlやらPythonやらの話が混ざっても良いんでない?

Part4 : スレリンク(linux板)
Part3 : スレリンク(linux板)
Part2 : スレリンク(linux板)
Part1 : スレリンク(linux板)

>>2-5あたりに色々と。

2:1様
09/04/03 22:19:41 pwv0zYsr
関連スレ
おまいら! sed の使い方教えて下さいm(_ _)m@linux板
スレリンク(linux板)
【Shell】どのシェル使ってる?【Script】@LINUX板
スレリンク(linux板)
シェルスクリプト総合 その14
スレリンク(unix板)
sed@UNIX板
スレリンク(unix板)
2ちゃん画像落としまくりスクリプト@UNIX板
スレリンク(unix板)
連番のH画像/動画を一気にダウンロードする2
スレリンク(unix板)

3:1様
09/04/03 22:20:49 pwv0zYsr
参考リンク
bashで始めるシェルスクリプト基礎の基礎 @IT
URLリンク(www.atmarkit.co.jp)
シェルスクリプト(Bash)入門 CYBERAM Documents Project
URLリンク(cyberam.dip.jp)

IBM developerWorks
実例でわかるsed
URLリンク(www-06.ibm.com)
URLリンク(www-06.ibm.com)
URLリンク(www-06.ibm.com)
実例でわかるawk
URLリンク(www-06.ibm.com)
URLリンク(www-06.ibm.com)
URLリンク(www-06.ibm.com)
コマンドラインからのグラフィックス操作
URLリンク(www-06.ibm.com)
洗練されたPerl: MP3とPerlで遊ぶ
URLリンク(www-06.ibm.com)
URLリンク(www-06.ibm.com)

4:login:Penguin
09/04/03 23:35:06 VWAfe8sR
awk ファンクラブ
スレリンク(linux板)

5:login:Penguin
09/04/04 01:01:09 zPRKkUO8
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。


□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。

6:login:Penguin
09/04/04 01:02:10 zPRKkUO8
□過去スレ:
シェルスクリプト総合 その13
スレリンク(unix板)
シェルスクリプト総合 その12
スレリンク(unix板)
シェルスクリプト総合 その11
スレリンク(unix板)
シェルスクリプト総合 その10
スレリンク(unix板)
シェルスクリプト総合 その9
スレリンク(unix板)
シェルスクリプト総合 その8
スレリンク(unix板)
シェルスクリプト総合 その7
スレリンク(unix板)
シェルスクリプト総合 その6
スレリンク(unix板)
シェルスクリプト総合 その5
スレリンク(unix板)
シェルスクリプト総合 その4
スレリンク(unix板)
シェルスクリプト総合 その3
スレリンク(unix板)
シェルスクリプト総合 その2
スレリンク(unix板)
シェルスクリプト総合 その1
スレリンク(unix板)

7:login:Penguin
09/04/04 01:05:07 zPRKkUO8
'Part4'のテンプレになってたから'その13'のテンプレも張っておいた。

8:login:Penguin
09/04/04 01:12:36 Tp2VlfaD
どうしてこのスレは忘れられてしまったのか!?

9:login:Penguin
09/04/04 01:21:05 zPRKkUO8
このスレは

「シェルスクリプト総合@LINUX Part14」

です。

10:login:Penguin
09/04/04 01:24:17 zPRKkUO8
違うよね。
UNIX版とごっちゃになっててごめん。

Part5であってる。

11:login:Penguin
09/04/04 14:55:03 or2+u8IA
(例えば)zshをシェルにしてて高度な機能とかつかっていると、"正規な"/bin/shで動かそうとした時にハマるってことだよね。

Linuxで各シェルの追加仕様とか機能とかつけずにsh相当の機能というか仕様で実行させるにはどうしたらいいの?

たとえばDebianとかはbashじゃなくってdashの方がいいのかな?

12:login:Penguin
09/04/04 17:44:34 2v8+JVJm
>>11
man bash

13:login:Penguin
09/04/04 17:54:04 0GvDrAb/
>>11
heirloom-sh か UNIX 板の方へいけばいいんじゃね?

14:login:Penguin
09/04/05 14:22:18 9jnUYPBK
>>12
なるほど。
#/bin/sh --posix
で始めればいいってことかな?

>>13
Heiroom shってぐぐるとPOSIX標準から外れているとかなんとか。
まcsh系みたいな論外系とは違うだろうし実用問題ないくらいには書けるそうなんだけど。

15:login:Penguin
09/04/09 01:09:15 fmCo0sq3
./resize input_img.png output_img.png 60
のような引数を渡すプログラムに

./resize img/*.png rlt_img/*.png 60
のように、ワイルドカードでファイルを読み込み、
そのワイルドカード部のファイル名で出力したいのですが
このようにするには、どのように記述すべきでしょうか?

16:15
09/04/09 01:13:00 fmCo0sq3
for file in *.txt
do
cp "$file" "$file.bak"
done

これで解決です、ありがとうございます

17:login:Penguin
09/04/09 02:01:01 sLNPV+qV
チョンプ

18:login:Penguin
09/04/12 14:56:44 zY73Wyps
シェルスクリプトで小数の比較って出来ないのでしょうか

if [ 1.1 -le 1.2 ];then

else

fi

ということをやりたいんですが。

19:login:Penguin
09/04/12 15:20:16 hHMEJJ0V
>>18
それはexprとかの外部コマンドを使わずに、ということか?

20:login:Penguin
09/04/12 15:36:21 zY73Wyps
>>19
いえ、外部コマンドの有無は特に気にしていないです
test コマンドは整数にしか対応していないとのことでしたので
別の方法でもあるのかなと

21:login:Penguin
09/04/12 15:48:04 Fl5RzaXW
echo "scale=1; 1.1 < 1.2" | bc

22:login:Penguin
09/04/12 16:23:36 zY73Wyps
>>21
なるほど。bc コマンドでも数値の比較が出来るのですね
ありがとうございました

23:login:Penguin
09/04/13 17:38:44 1oC+4w67
質問です。
カレントディレクトリ内のファイルの拡張子を ".m4a" から ".m4b" に
変更するスクリプトを作ろうと思いました。

#!/bin/bash




for oldName in `ls *.m4a`; do
 newName=`echo "$oldName" | sed s/\.m4a/\.m4b/`

 
mv "$oldName" "$newName"

done

しかし "ファイル 名.m4a" のようにファイル名に空白が含まれると、
"ファイル" と "名.m4a" の2つに分割して処理されてしまいました。
1つのファイルとして処理させるにはどうしたらよいでしょうか?
よろしくお願いします。

24:23
09/04/13 17:40:46 1oC+4w67
すいません書き込みに無駄な空行がたくさん入ってしまいました

25:login:Penguin
09/04/13 18:05:27 aG/DWGVb
rename コマンドじゃダメ?

26:login:Penguin
09/04/13 18:40:55 eDZK/GRn
>>23
for name in *.m4a; do
mv "$name" "${name%.m4a}.m4b"
done
でどうでしょうか

27:23
09/04/13 21:05:06 jrO4FfOZ
>>25
検索したところ使えるようですね。
ありがとうございました。

>>26
うまくいきました。変数の構文も参考になります。
ありがとうございました。

28:login:Penguin
09/04/13 23:49:04 HMXUAP3X
IFS=""とかじゃダメなんかな

29:login:Penguin
09/04/17 09:02:35 91/yURYl
rename -v 's/\.m4a$/.m4b/' *
これでいいじゃん。
スクリプトじゃないけど実態はPerlでevalしてるだけだし。

30:login:Penguin
09/04/18 01:13:29 6AHWtliB
BSD 系 (FreeBSD, OpenBSD のみ)と Linux 系で動く sh で1〜100までのループを表現したいんですが、どうすればいいんでしょうか?
妥協して、bash で書いてしまうのもありなんですが、Unix like OS 標準の s hで行きたいところです
また、CentOS の環境に /bin/awk は入っていたんですが、OpenBSD には、標準で入っていないんですよね
あと三番目の bash バージョンは、CentOS だと #!/bin/bash --posix でも #!/bin/sh でも動いてしまうんですが、正当な sh で動かすには、どうしたらいいのでしょうか?
/* c */
for(i=1; i<=100; i++){
printf("%d ",i);
n}
# sh with awk
for i in `awk 'BEGIN { for( i=1; i<=100; i++ ) print i }'`; do
echo -ne "$i "
done
# bash
for (( i=1; i <= 100; i++ ))
do
echo -ne "$i "
done


31:login:Penguin
09/04/18 01:36:18 6AHWtliB
自己解決しました
emacsテンプレートの馬鹿w

command-listがまだ慣れないっすね

32:login:Penguin
09/04/18 05:46:37 echGlS2v
>>30
forにこだわらないなら

i=1
while [ $i != 101 ]; do
printf "%03d " $i
i=`expr $i \+ 1`
done

こんなんのもアリかも。

33:login:Penguin
09/04/18 08:32:44 z+Q5Ng+G
seqでforを回す人が以前いたよね。

for i in `seq 1 100`

34:login:Penguin
09/04/18 16:08:22 Fbv8BZKW
for i in `seq 100`; do echo $i; done
俺この方法好き

35:login:Penguin
09/04/18 16:40:49 h9pcedkY
for i in `seq -w 100`; do echo $i; done
の方が好き

36:login:Penguin
09/04/20 18:07:25 nHdRbS/v
もまいら、なかなかうまいな

37:login:Penguin
09/04/24 12:57:30 b7e2t/yg
trapについて教えてください
------hoge.sh----
#!/bin/bash
trap '' INT
sleep 1
echo hoge
sleep 1
echo hoge
-----------------

上記のスクリプトを実行し、Ctrl+c を押しっぱなし
にしても正常に最後までechoし終了するのですが、最後にscpをいれると固まります
------hoge.sh----
#!/bin/bash
trap '' INT
sleep 1
echo hoge
sleep 1
echo hoge
scp hostname:file1 ./file2
-----------------
これの回避方法を教えてください。


38:login:Penguin
09/04/25 18:13:43 xpy/PYPF BE:1185862267-S★(614436)
ファイル名の一括変換なんかができたらなぁと思っています。

まいにちフランス語_4月13日放送分.mp3 → FR20090413.mp3
まいにちフランス語_4月14日放送分.mp3 → FR20090414.mp3
まいにちフランス語_4月15日放送分.mp3 → FR20090415.mp3
まいにちフランス語_4月16日放送分.mp3 → FR20090416.mp3
まいにちフランス語_4月17日放送分.mp3 → FR20090417.mp3

というルールでファイル名を一括変換したいのですが、
シェル・スクリプトでどう書けばいいのかさっぱり分かりません。
どなたかお助け願えませんでしょうか?よろしくお願いいたします。


39:login:Penguin
09/04/25 19:52:53 kvdAirHU
>>38
見習い中の者だけど、直接、mvするのは書けた

でも
cp
rm -iとしたいけど、適当な記述が思いつかない

雨がやんだっぽいので買い出しに行ってきます

40:login:Penguin
09/04/25 19:58:44 0GMAGDVv
>>38 自己レスです。
まいにちフランス語_4月13日放送分.mp3 → FR20090413.mp3
のうち、URLリンク(tinyurl.com) を参考に、
まいにちフランス語_4月13日放送分.mp3 → FR2009413.mp3
までは自力でなんとか出来ました。4月を04と2桁にするのだけが分かりません。

現在のスクリプトは以下です。
for base_name in `find ./ -name "まいにちフランス語_*"`
do
rename=`(echo ${base_name} | sed 's/まいにちフランス語_/FR2009/g' | sed 's/月//g' | sed 's/日放送分//g')`
mv ${base_name} ${rename}
done
あとどう直せば希望通りの動作を実現できるのでしょうか。どなたかお助け下さい。お願いいたします。

41:login:Penguin
09/04/25 20:39:12 KQhyDGwp
sed -e 's/^[^0-9]*/FR2009 /' -e 's/月/ /' -e 's/日放送分/ /' | awk '{printf"%s%02d%02d%s",$1,$2,$3,$4}'

42:login:Penguin
09/04/25 22:21:23 gHQ99EuD
>>40
回答じゃないけど、なんか元ファイルに想定外なのがあって上書き、とかを避けるため、
mvじゃなくって同一driveの別ディレクトリにハードリンクのがオレは好み。

個数とか確認後に元を消すだけだし、容量的にも×2必要ってわけじゃねぇし。

43:login:Penguin
09/04/25 22:37:34 kvdAirHU
>>42
プログラムエラーがあるかもしれないぐらいの気合いの入っていないプログラムだと
ファイル操作に慣れていないと結構大変だね

mvじゃなくcpして、元ファイルは/tmpに移しておけばいいんかな
/tmpについてそこまで詳しく知らないけど、ある日数とtmpの容量がオーバーしたら
勝手に消えるんでしょ?
dfでマイナス表記をみた記憶があった気もするけど

HDDも安くなったから、事前にmkdir ~/tmpと作っておいて、ゴミ箱的に使うのがいい感じなのかな

44:login:Penguin
09/04/25 22:46:19 U0RjRCaW
>/tmpについてそこまで詳しく知らないけど、ある日数とtmpの容量がオーバーしたら
>勝手に消えるんでしょ?
(´・ω・`)・・・

45:login:Penguin
09/04/25 23:29:31 z0Vi8pSt
>>38,40
#!/bin/sh
find ./ -name 'まいにちフランス語_*' | while read line
do
mv -i "$line" `echo "$line" | sed \
-e 's/\([^0-9]\)\([0-9]月\)/\10\2/' \
-e 's/\([^0-9]\)\([0-9]日\)/\10\2/' \
-e 's/まいにちフランス語_/FR2009/' \
-e 's/月//;s/日放送分//'`
done

46:login:Penguin
09/04/26 16:11:48 NYZwuLsV
$ ls "*"
ls: cannot access *: そのようなファイルやディレクトリはありません

これって展開されないんだ?


47:login:Penguin
09/04/26 16:46:19 /3VhflV8
>>46
> $ ls "*"
それだと$ ls \*と同じじゃないの?
$ ls *なら展開される

試しに$ echo "foobar" > "*"とすると*というファイル名できるんだね
また$ echo "foobar" > "2*2=4"でもちゃんとできる
$ echo "hoge" > "2+2=4"としておいて
$ ls 2*2=4だと、2*2=4 2+2=4の二つが出てきますが

まあ、そういうことなんでしょ
ファイル名はShellにとって特殊文字の*?は使わないほうがいいんだっけ?

$ rm *とやったら、どうなるんだろ
こわくてできない

48:login:Penguin
09/04/26 17:51:05 NYZwuLsV
ダブルクォートだと展開されるような気がしてたけど
勘違いか、そっか。

> ファイル名はShellにとって特殊文字の*?は使わないほうがいいんだっけ?
頭に '-' とかもコマンドによってはオプションとして識別するからね。
$ date > --help

$ cat '--help'
使用法: cat [オプション]... [ファイル]...


$ cat -- '--help'
2009年 4月 26日 日曜日 17:49:26 JST


49:login:Penguin
09/04/26 18:15:04 6AxKKceD
>>46
URLリンク(www.linux.or.jp)
> パターンマッチング
> 特殊パターン文字をその文字そのものにマッチさせるためには、クォートしなければなりません。


50:login:Penguin
09/04/26 18:18:28 cQuTU2RN
ダブルクォート中で有効なメタ文字は「$\`」

51:login:Penguin
09/04/26 18:33:49 /3VhflV8
>>48
対話インタプリタ(コマンドライン)のときとシェルスクリプトを実行するときに挙動に違いがあるってことかな
echo `*`だと二回出るのは、なんなんだろ
うーん
$ cat foo.sh
echo '[command] *'
echo `*`
echo '[command] ls *'
echo `ls *`
echo '[command] ls "*"'
echo `ls "*"`
echo '[command single-qoate] ls *'
echo `ls '*'`
echo '[command] ls \*'
echo `ls \*`

> > ファイル名はShellにとって特殊文字の*?は使わないほうがいいんだっけ?
> 頭に '-' とかもコマンドによってはオプションとして識別するからね。
そうだね
他人が作ったプログラムを動かすときに'-'は予期しにくい挙動しそうだから、控えたほうが良さそうだけど
でも、'*?'をファイル名に使っても良さそうに思えるなあ
実際、どうなんだろ

52:login:Penguin
09/04/26 19:20:08 4i92v2TV
echoと一口に言っても
coreutilsのechoやbashのビルトインecho
dashやzshのビルトインechoは挙動が違う

53:login:Penguin
09/04/26 19:46:21 /3VhflV8
>>52
>・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
> bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
> Linuxユーザは/bin/shの正体がbashなので特に注意。
とあるわけだし
zsh, dashは関係ないんじゃないの?
Linux板のスレというのもあってLinux依存に関することは、多少寛容なんでしょうけど
まあ、そういう自分はLinuxなんであれですが

あと「特に注意」とあるけど、環境明示なしの質問でsh関連の質問に答えるためにどういう環境があればいいの?
ここのスレと@UNIXスレの質問の答えになる程度の妥協した現実的な環境として

仮想OSなしでLinux上で整えることができるんでしょうか?
純正shと聞くOpenSolarisのshでちゃんと動けばいいの?
FreeBSD, OpenBSDでは満たせないんでしょうか?

54:login:Penguin
09/04/26 20:05:49 z35DirHv
(意図通りに)動けば正義

55:login:Penguin
09/04/26 20:13:36 IdxLO+dc
>>53
> >・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
> > bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
> > Linuxユーザは/bin/shの正体がbashなので特に注意。
> とあるわけだし
ID:zPRKkUO8 が UNIX 板と間違えて貼ったテンプレを持ち出して
なにがしたいの?


56:login:Penguin
09/04/27 22:45:23 zIUJH1+o
>>41
どうもありがとうございます。レスが遅くなって申し訳ありません。
大変長期に渡るアク禁を喰らっている者で、元の >>40 の質問もこの投稿も、
どちらも代行スレ経由で投稿してもらっております。
>>41 で教えていただいたスクリプトで確かに希望通りの動きをするのですが、
sed の部分も awk の部分も、どちらもどういう操作を命令しているのか、
イマイチ理解が出来ておりません。スクリプトの内容を、
簡単に解説していただけませんでしょうか?
>>45 さんもありがとうございます。


57:login:Penguin
09/04/27 22:52:48 doFZwSgR
>スクリプトの内容を、
>簡単に解説していただけませんでしょうか?
そりは、あーたの仕事ですがな。
調べて解らん部分を訊かんと。

58:login:Penguin
09/04/28 01:07:02 2xnVN10b
>>41 はどこも難しいとこないよ。
基本的なことしかしてない。

59:login:Penguin
09/04/28 01:12:22 7KxLupvN
awkは必要?
awk '{printf"%s%02d%02d%s",$1,$2,$3,$4}'のようにprintf文だけ理解していればいい?

60:login:Penguin
09/04/28 03:06:53 zC1qen3j
そんなことを他人に聞くようなら
初めからrubyやpythonなんかで書きなさい

61:login:Penguin
09/04/28 12:10:33 2xnVN10b
>>59
意味わかんないけど
目的が達成できれば何でもいいんじゃね。

62:login:Penguin
09/05/04 01:16:30 Z02vxYwi
∩゜∀゜∩

63:login:Penguin
09/05/08 16:39:20 /GOSAdyI
foo |
bar



foo | \
bar

って違いあるの?

64:login:Penguin
09/05/08 20:18:40 3ejrnY18
バックスラッシュ可愛いよ | \ァ | \ァ・・・

65:login:Penguin
09/05/09 01:08:35 unYbYLqh
>>63の上のように書けるなんて、俺ぁ始めて知ったよ。

66:login:Penguin
09/05/09 02:44:39 R823USQU
>>56
オライリーの詳説正規表現(ふくろう本)とsed&awk(めがねざる本)を
おまえの金で買って嫁。
まずはそこからだ。
>>57が言うように、まずは勉強してから聞いた方が良い。

67:login:Penguin
09/05/10 23:02:29 QXYPExpJ
命題=USB接続のストレージを全てumountする(サスペンド/ハイバネのハンドラで使う)
ls -l /dev/disk/by-path/ | while read DEV; do
DEV=${DEV#*usb*/*/}
case $DEV in
sd?[0-9])
echo "umount /dev/$DEV"
;;
esac
done

どんなもんでしょ?
もっと賢い方法ありますか?
諸兄に採点願いたい

68:login:Penguin
09/05/10 23:09:18 6t5VOjiz
>>67
目線が高い

69:login:Penguin
09/05/11 07:09:17 0Zy7nDFj
>>67
SATAのHDDもアンマウントされるよね?どうすんの??

70:login:Penguin
09/05/11 17:10:02 fWM1Begt
>>69
DEV=${DEV#*usb*/*/}
*usb*

71:login:Penguin
09/05/12 23:16:06 6EJpjlI0
シェルで出来るかなと考えず、
最初からrubyやperlでやっちゃう人も多いですよね。
現実問題として、ファイル処理やテキスト処理以外の大多数は
他の言語でやったほうが楽ですよね。

結局、シェルスクリプトってどんな時に便利なんですか?

72:login:Penguin
09/05/12 23:20:01 D0y0zjLK
>>71
パイプでガスガスコマンド繋ぎたいとき。

関数型言語のような気持ちよさ。

73:login:Penguin
09/05/13 19:34:16 V3jwSh7A
>>71
ファイル処理やテキスト処理のときに便利だと、自分で言うとるやないか。

74:login:Penguin
09/05/13 22:24:14 u0Eoo5tc
たとえばサスペンド/ハイバネのハンドラは一応クリティカルなので最小限で済ましたい
bashオンリー、sedやawkも控える
サスペンド/ハイバネ自体もbashをフロントエンドにして実装されてる

75:login:Penguin
09/05/14 19:14:39 VFAnBpU/
旧いノートにCentOSを入れて酷使してるんだが
もっと愛が必要だと思ったので作った。
もっと良い書き方あるかな

#!/bin/sh

THROTTLING=/proc/acpi/processor/CPU0/throttling
TEMPERATURE=/proc/acpi/thermal_zone/THM0/temperature
STATE_COUNT=8
THRESHOLD_TEMPS='75 70 65 63 62 61 60 0'

get_temperature() { sed -e 's/[^0-9]*//g' < $TEMPERATURE}
set_state() { echo -n $1 > $THROTTLING }

start() {
while(:); do
sleep 2
current_temperature=`get_temperature`
i=$STATE_COUNT
for threshold_temp in $THRESHOLD_TEMPS; do
let i--
if (( $threshold_temp < $current_temperature )); then
set_state $i
break
fi
done
done
}
#daemonにするにはデタッチが必要らしい
start &


76:login:Penguin
09/05/21 14:21:38 8Ph6oUED
時刻を利用したものを書きたいんですがどうもよくわかりません。
dateとgrepを利用するのはなんとなくわかるんですがさっぱりです。

<例>引数として与えた時刻になったときに‘wake up!’と表示する

どなたかお助けいただけませんでしょうか。お願いします。

77:76
09/05/21 17:13:53 ZE+yaPSj
大学から書き込んでます。
うちの教授がこのスレを見ているらしいです。

このスレの回答を課題として提出したら単位をくれないと思うので
質問を取り消します。


78:login:Penguin
09/05/21 17:14:26 8WrmPGB1
そうかそうか

79:login:Penguin
09/05/21 17:23:51 Ed3fgcAs
>>77
wikipediaでshのチュートリアルがあるんで、それ読めばだいたいのことは解決すると思う
あとmanを読む

80:76
09/05/21 17:28:06 ZE+yaPSj
>>79
ありがとう。でも読むのめんどくさいです。退散します

81:login:Penguin
09/05/21 18:06:18 YOkJVZm9
>>76=77=80
氏ね

82:login:Penguin
09/05/21 18:19:28 Ed3fgcAs
>>81
おれも思った

83:login:Penguin
09/05/21 18:33:46 X//3znla
>>76です。

今度はネットカフェから書き込んでいます。
>>77, >>80は僕ではありません。
信じてください ><

84:login:Penguin
09/05/21 18:41:39 W9MVWV0e
イエーイ、教授見てる〜?

85:login:Penguin
09/05/21 18:45:00 50DHcUbO
じつを言うと>>76は俺
信じてくれなくても良い

86:login:Penguin
09/05/28 23:08:08 MG6SQpHS
ディレクトリ構造を保持して特定のファイルをコピーするにはどうすれば良いでしょうか?
cp -a a/b/c/d.txt e/
とやると e/d.txt となってしまいます。
e/a/b/c/d.txt となって欲しいのですが。



87:login:Penguin
09/05/28 23:14:48 OYPHtyPP
>>86
tar cvz a/b/c/d.txt | tar xvzf -C e/ -

88:86
09/05/28 23:50:32 MG6SQpHS
>>87 Thx!

89:login:Penguin
09/05/29 00:01:04 rPFmiLnc
一方ロシアは--parentsを使った

90:login:Penguin
09/05/29 01:25:22 H2hlYKbU
出遅れた
echo a/b/c/d.txt|cpio -p e

91:login:Penguin
09/05/29 20:09:43 ZTU2Uga5
rsync -aR a/b/c/d.txt e/

92:login:Penguin
09/06/15 15:03:52 An1qKLCY
くだスレから移動してきました。

bashで
(for i in a b c d; do
X
done) | A | xargs B ;
C;

のような処理を行ったとき、B の処理をまだやっているうちに
Cの処理に移ってしまうのですが、Bの処理が終わるのを
待つようにするにはどのようにすればよいのでしょうか?

これまではそんな動作はありえない思っていたのですが、Cで
ps で確認すると、B がまだ動いています。

もしバグだとすると、bash,libc,kernelのどのあたりになるでしょうか。
その確認方法はなにかありますか?

93:login:Penguin
09/06/15 15:51:41 FRq6RhHc
>>92
bashが待つのはBじゃなくてxargsの終了だからその辺でなんかあるのかもしれんが、
とりあえずその状態のときの各プロセスの親プロセス番号を確認したいところだな。

94:login:Penguin
09/06/15 17:00:15 An1qKLCY
>>93
ありがとうございます。Bの親はinitになってました。
xargsが勝手に終了してしまうのが問題みたいですね。
その辺調べてみます。

95:login:Penguin
09/06/15 20:49:11 oAD3AKfh
初歩的な質問ですみません。readコマンドについてです。

#!/bin/bash

ls * | while read result
do
echo $result
done

と書くとカレントディレクトリの内容がechoで表示されます。

これを
ls * | read result ; echo $result
と書いても同じように出力されそうな気がするのですが、
空行がでて終わってしまいます。
何が違うのでしょうか?


96:login:Penguin
09/06/15 22:25:53 FILO8IMv
後者は1行しか読んでないんじゃない?

97:login:Penguin
09/06/16 01:01:11 nzUvvcuW
>>95
URLリンク(www.faqs.org)

98:login:Penguin
09/06/18 15:45:23 dQ4OojSv

#!/bin/sh

for FILE in "$@"
do
if [ -f $FILE ]; then
echo "$FILE is a file"
fi
done

だと、$FILE変数には、引数の記述により、相対パスも絶対パスもありえます。
$FILE変数を絶対パスに変換する方法はあるでしょうか?


99:login:Penguin
09/06/18 15:53:07 s3sHtQVu
>>98
あれば realpath

100:login:Penguin
09/06/18 15:59:02 dQ4OojSv
>>99 ないっす。

101:login:Penguin
09/06/18 16:21:59 0zcffroC
>>98
readlink -f


102:login:Penguin
09/06/18 16:44:51 dQ4OojSv
>>101 古いLinuxでreadlinkはシンボリックリンクのときのみ動作でした。

#!/bin/sh

W_PWD=`pwd`

for FILE in "$@"
do
if [ -f $FILE ]; then
cd $W_PWD
abpath=$(cd $(dirname $FILE) && pwd)/$(basename $FILE)
echo "$abpath is a file"
fi
done

しょうがないので、プログラムしてみた。
これで、$abpath に絶対パスが入るようになった。
シェルスクリプト暦浅いのだが、ベテランから見て問題なさそう?

103:login:Penguin
09/06/18 17:05:37 aPpB1FUW
kshだとrealpathはビルトインなのね

104:login:Penguin
09/06/18 17:09:36 aPpB1FUW
無かったスマソ

105:login:Penguin
09/06/18 17:23:14 dQ4OojSv
#!/bin/sh

for FILE in "$@"
do
if [ -f $FILE ]; then
abpath=$(cd $(dirname $FILE) && pwd)/$(basename $FILE)
echo "$abpath is a file"
fi
done

これでいいんだ。

106:login:Penguin
09/06/18 17:49:22 S07Tjv1V
いや、ファイル名に空白あったらアウト

変数は基本""で囲む
お兄さんとの約束だ

107:login:Penguin
09/06/18 18:59:36 dQ4OojSv
なるほど。

ありがとうございました。

108:login:Penguin
09/06/18 19:18:06 dQ4OojSv
おっと、ひとつ質問良いですか?

abpath=$(cd $(dirname $FILE) && pwd)/$(basename $FILE)

この後、カレントディレクトリ変わらないのはなぜですか?

109:login:Penguin
09/06/18 20:19:19 S07Tjv1V
cdしているのはサブシェルだから

110:login:Penguin
09/06/18 20:26:28 dQ4OojSv
調べてました。
()の中はサブシェルによって実行されるんですね。

111:login:Penguin
09/06/18 22:56:25 dQ4OojSv
>>98 です。
諸兄のおかげで、無事目的通りのスクリプトが組めました。
今後かなり作業効率が向上します。

感謝


112:login:Penguin
09/06/23 22:19:47 c8G3nrDU
bashの勉強のために、JMの該当するmanページをw3mで見るスクリプトを書いています。
ダブルクォーテーションの使い方など、細かいところも添削お願いできますでしょうか。

#!/bin/bash
# @(#) man on linux.or.jp
#
COMMAND=`which w3m`
PAGE=
SECTION=
SECT=("on" "on" "on" "on" "on" "on" "on" "on")
SECTURL=
BASEURL="URLリンク(search.linux.or.jp)"
URL=
if [ \( ! -e "$COMMAND" \) -o \( ! -x "$COMMAND" \) ]; then
echo "not installed w3m"
exit 1
fi

while getopts S:h OPT
do
case $OPT in
S) SECT=("off" "off" "off" "off" "off" "off" "off" "off")
SECTION=$(expr $OPTARG - 1 2>/dev/null)
if [ $? = 2 ]; then
echo "secion number is invalid. exit."
exit 2
fi
SECT[$SECTION]="on";;
h | ?) printf "Usage: %s: [-S secion] page\n" $0
exit 2;;
esac
done

113:112
09/06/23 22:21:09 c8G3nrDU
shift $(($OPTIND - 1))
PAGE="$1"
if [ x$PAGE == x ]; then
echo "What manual page do you want?"
exit 1
fi

i=1
for onoff in ${SECT[@]}; do
if [ x"$onoff" = x"on" ]; then
SECTURL="$SECTURL"'&Sec'"$i"'='"$onoff"
fi
i=$(expr $i + 1)
done
URL="${BASEURL}"'Pagename='"${PAGE}"'&submit=Search%21'$SECTURL

$COMMAND "$URL"

よろしくお願いします。

114:login:Penguin
09/06/23 23:37:11 iNYrdW4A
120点

115:login:Penguin
09/06/23 23:41:00 9feAjnJ4
bash限定(shで使わない)なら、外部コマンドよりbashの内部コマンドを使った方が速くなりますよ。
i=$(expr $i + 1) → ((i++)) とか。

116:login:Penguin
09/06/24 00:57:03 23DWLrsu
for (( expr1 ; expr2 ; expr3 )) ; do list ; done

117:112
09/06/24 01:41:57 B7cQg4Om
>>114-116 ありがとうございます。
早速、(( ))を使って書き直しました。
10万までインクリメントしていくだけのスクリプトで
速度を計測してみたのですが、全然違うのですね!
./tmp.sh 4.64s user 0.10s system 99% cpu 4.788 total
./tmp.sh 92.07s user 111.03s system 96% cpu 3:31.31 total
exprの方(下の方)が遅いです。

それと一貫性が無いように感じたので、1行目のwhichの文を$(which w3m)としました。
また、bashを見てみると[[ ]]という組み込みの評価式があったので、
if [ \( ! -e "$COMMAND" \) -o \( ! -x "$COMMAND" \) ]; then
という部分を変更しました。
if [[ ( ! -e "$COMMAND" ) || ( ! -x "$COMMAND" ) ]]; then
これも計測してみたら、若干ですが[[ ]]の方が速かったです。

>>116で挙げられた記法を使用したことで変数が1つ減りました。

こんな感じになりました。
#!/bin/bash
# @(#) man on linux.or.jp
#
COMMAND=$(which w3m)
PAGE=
SECTION=
SECT=("on" "on" "on" "on" "on" "on" "on" "on")
SECTURL=
BASEURL="URLリンク(search.linux.or.jp)"
URL=
if [[ ( ! -e "$COMMAND" ) || ( ! -x "$COMMAND" ) ]]; then
echo "not installed w3m"
exit 1
fi

118:112
09/06/24 01:45:08 B7cQg4Om
while getopts S:h OPT
do
case $OPT in
S) SECT=("off" "off" "off" "off" "off" "off" "off" "off")
SECTION=$(expr $OPTARG - 1 2>/dev/null)
if [[ $? == 2 ]]; then
echo "secion number is invalid. exit."
exit 2
fi
SECT[$SECTION]="on";;
h | ?) printf "Usage: %s: [-S secion] page\n" $0
exit 2;;
esac
done
shift $(($OPTIND - 1))
PAGE="$1"
if [[ x$PAGE == x ]]; then
echo "What manual page do you want?"
exit 1
fi

for ((i=1; i<${#SECT[@]}; i++))
do
if [[ x"${SECT[i-1]}" = x"on" ]]; then
SECTURL="$SECTURL"'&Sec'"$i"'='"${SECT[$((i-1))]}"
fi
done
URL="${BASEURL}"'Pagename='"${PAGE}"'&submit=Search%21'"$SECTURL"
$COMMAND "$URL"
変数が空の場合だったらとかスペースが含まれていたらとか、その辺りをよく理解しておらず、
とりあえずダブルクォートしてたりするのですが、無駄な部分があったりしますでしょうか。
細かい部分でも構いませんので、訂正していただけると嬉しいです。長文失礼しました。

119:login:Penguin
09/06/24 02:04:47 aKYWDWvt
そのままでも全然いいと思うよ(^_^)

120:login:Penguin
09/06/24 08:42:54 CrOO7ztU
COMMAND=$(which w3m)

COMMAND=$(command -v w3m)
で外部コマンドはサヨウナラ

SECTION=$(expr $OPTARG - 1 2>/dev/null)
if [[ $? == 2 ]]; then
echo "secion number is invalid. exit."
exit 2
fi

let SECTION="OPTARG - 1" 2>/dev/null
case $SECTION in
[0-7]) :;;
*) echo "secion number is invalid. exit."
exit 1;;
esac
で外部コマンドはサヨウナラ

if [[ ( ! -e "$COMMAND" ) || ( ! -x "$COMMAND" ) ]]; then

if [[ ! -x "$COMMAND" ]]; then
で十分だと思うが

121:login:Penguin
09/06/24 09:19:46 aKYWDWvt
>>120
> COMMAND=$(command -v w3m)
w3mがaliasされてたらwhichと結果がかわるよ

122:login:Penguin
09/06/24 09:37:52 BWmtmrUC
bashってtypeないの?

123:112
09/06/24 13:57:32 qAybS9Ki
>119-122 レスありがとうございます。
今回作ったスクリプトでJMのbashを見ながら、こんな風にしてみました。
INTERRUPT=0
COMMAND=$(
 if [[ $(builtin type -t w3m) != "file" ]]; then
   echo "may not installed w3m" >&2
   INTERRUPT=1
   exit 1
 fi
 IFS=' '
 set $(builtin type w3m)
 echo $3
)
if [[ $INTERRUPT == 1 ]]; then
exit 1
fi
unset INTERRUPT
こんなトリッキーなものを書いたのは初めてですが、これでエイリアスの場合も大丈夫でしょうか?
# .bashrcにalias w3m='ls -l'と書いてみたのですが、
# type -tの結果がaliasになりませんでした。何故なのでしょうか...

letは目から鱗でした。
「数字じゃない文字列が入力された時」(例えば"aaa"とか)
をキャッチするために$?==2を使いたかったので、敢えて$(( ))を使えず、$( )を使っていました。
ですが、「セクション番号以外が入力された時」とまとめてしまえば、もっと安全ですね。
一貫性持たせるためにletを使わずにSECTION=$((OPTARG - 1));case云々...esac;
とできるか、と思いましたが、letも数字から始まっている文字列("3aa"とか)
だったりすると標準エラーに吐くのですね。便利です。let。

ファイルテストの部分は仰る通りです。わたしの勘違いです。
ご意見ありがとうございます。

124:login:Penguin
09/06/24 14:40:30 BWmtmrUC
>>123
そんな面倒なことはせんでもええ

if ! type -P w3m >/dev/null; then
echo '(# ゚Д゚)'
fi

125:112
09/06/24 17:05:52 qAybS9Ki
何度もすみません。

Pオプションが、原文のman bashにしか書いようで、
書いてある英語がよく分からないのですけれど (-_-A;
こういうことが書いてあるんでしょうか?

pオプションは、エイリアスとか関数があったら何も返さないけれど、
そういう時でもPオプションは、ファイルだけを対象にしてそのパスを表示する。
間違ってたら恥ずかしいです。

if ! COMMAND=$(builtin type -P w3m 2> /dev/null); then
 if [[ ! -x $COMMAND ]]; then
   echo "not installed w3m" >&2
   exit 1
 fi
fi
ファイルテストと合わせて、COMMANDを取得するところはこんな感じになりました。
他は、>>117,118と同じです。

126:login:Penguin
09/06/24 19:01:09 h5ARTQfu
aliasにするには同シェルスクリプトファイル内に書くか.を使うか
例えばこう
shopt -s expand_aliases
. ~/.bashrc
type -t w3m

SECTURL="$SECTURL"'&Sec'"$i"'='"${SECT[$((i-1))]}"
みたいなのは
SECTURL="$SECTURL"\&Sec"$i"\="${SECT[$((i - 1))]}"
とエスケープ使ったほうが読みやすいかもな

127:login:Penguin
09/06/24 19:29:28 w4EkT5LC
>>126
俺は関数化して環境登録することが多いです。
function w3m() {
  ls -l
}
export -f w3m

128:login:Penguin
09/06/26 01:44:08 +M5S3VDp
質問です。前処理をして、
URLリンク(www.youtube.com)
のようなURLを列挙したファイル(you.txt)を用意してあり、
yt=$(cat you.txt | sed -e "s/&t.*//g; s/^.*video_id=//g") && \
wget -O $yt.flv -c -i you.txt
で動作させた場合、
思惑通り一個目は、-AKQ6CUJa90.flv というファイル名で取ってこれるのですが、
二個目以降はファイル名の抽出が働かず、
ローカルに保存されるのは同名のファイル名となってしまいます。
どのようにすれば思惑通りファイルを取ってこれるのでしょうか?


129:login:Penguin
09/06/26 02:55:31 5uTursO/
for

130:login:Penguin
09/06/26 03:43:24 5uTursO/
for youtube_url in `cat you.txt`; do
wget -c -O "`echo "$youtube_url" | sed 's/video_id=\(.*\)&t\1/g'`.flv" "$youtube_url"
sleep 5
done
でどうでしょうか

131:login:Penguin
09/06/26 06:18:01 3RE4KePV
for youtube_url in `cat you.txt`; do
wget -c -O "`echo "$youtube_url" | sed 's/^.*video_id=\(.*\)&t.*$/\1/'`.flv" "$youtube_url"
sleep 5
done
…でどうでしょうか(^_^;)

132:login:Penguin
09/06/26 06:31:57 3RE4KePV
id変わってる…(^_^;;)

133:128
09/06/26 11:30:36 WtRHx5He
>>130, 131
お知恵を元にして、目的を果たせました。ありがとうございます。
感謝しています。
なお、自分の書き込んだ内容でも、いちおうファイル名の抽出には成功する模様?
試行錯誤してみるのも、面白いですね。ではでは。


134:login:Penguin
09/06/30 11:41:15 Iil9pev3
質問です。
現在、kshを使用してテストをしているのですが、
ステップが多すぎて(1k↑)カバレッジを求められてます。

カバレッジツールが無いかグーグル先生に聞いてみましたが
全く引っかからなく・・・

シェルのカバレッジを求めている人はどんな方法で求めていますか?


135:128
09/07/01 04:20:50 3OeIBl6N
echo "What terms?"; read terms; terms="${terms// /+}"
T="$HOME"
mkdir -p $T/${terms}
for n in $(seq 0 10); do w3m -dump_source \
"URLリンク(images.google.com)" \
| sed -e 's/","http/\n","http/g; s/","/\n","/g' | grep -E -w "\",\"http:.*.jpg" | sed -e 's/^.*http/http/g' | wget -P $T/${terms} -r -l 1 --timeout=60 --tries=3 -c -e robots=off -U 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' -i -
done


136:login:Penguin
09/07/06 22:31:23 tHSUGfrq
( sleep 1h; echo "hello" ) > file

ってやると、fileは1時間openしっ放しになるンすかね?

137:login:Penguin
09/07/07 09:03:43 jQkxOO5Q
>>136
なるだろ。lsofとか使って観察してみるといい。

138:login:Penguin
09/07/08 01:51:04 SE49fktK
sleep 3600 > file でよくないか?


139:login:Penguin
09/07/08 02:18:59 VRCFK11t
お前は何を言っているんだ

140:136
09/07/08 07:54:59 77+BAR3B
>>137
だおうもありまとう
>>138
なんでもいいよ!!

141:login:Penguin
09/07/12 10:36:19 KKJfcIYB
質問があります.
直接スクリプトの話ではないんですが,
あるファイルに xxx という文字が含まれていなければ xxx を末尾に追記したい,
という場合みなさんどうされています?

grep とか使って条件分けすればできるのはわかるんですが,もっとスマートに
やる方法があれば教えてください.

142:login:Penguin
09/07/12 10:37:35 1p3v2qzF
sed

143:login:Penguin
09/07/12 10:41:49 1p3v2qzF
ああファイルの話だったか
じゃあ素直にgrep

144:141
09/07/12 10:44:36 KKJfcIYB
>>142
それよりは
% grep XXX file || echo XXX >> file
の方がわかりやすい気が.

質問の意図としては,下記のように記述できる nanika コマンドのようなもの
がないか知りたかったです.

% nanika XXX file

145:login:Penguin
09/07/12 12:20:21 2S8ITALR
ない

146:login:Penguin
09/07/12 12:53:03 VHWHiWuB
>>144
ない。
なぜ nanika XXX file がスマートなのか知りたい。

147:login:Penguin
09/07/12 18:16:12 elf51XSl
grep --creeping-deth

148:login:Penguin
09/07/12 19:44:16 o8qLTMAv
death
じゃないのか。

149:login:Penguin
09/07/12 20:31:41 elf51XSl
>>148
--orz


150:login:Penguin
09/07/14 14:57:37 gyyoowtT
nanika() {
while read line
do
case "$line" in
*$1*) return
esac
done <"$2"
echo $1 >>"$2"
}

151:login:Penguin
09/07/14 15:44:41 CH7bWn6s
つまらん。

152:login:Penguin
09/07/14 21:42:07 LzAZSljQ
:(){ :|:& };:


153:login:Penguin
09/07/20 15:40:26 K8L8w1qf
age

154:login:Penguin
09/07/20 21:55:40 ae6hxCnx
ps aux | grep processA
でグレップしたプロセスのIDを変数に格納するにはどうかいてやればいいでしょうか?


155:login:Penguin
09/07/20 22:11:42 ODKc/pMj
変数=`ps aux | grep processA | gawk '{print $2}'`

156:login:Penguin
09/07/20 22:32:09 ae6hxCnx
>>155 ありがとう
特定のプロセスAが起動したら、date >> /home/log
としたいと考えています。ただし、プロセスAは、 grep で把握できるとして、
複数の場合があります。
この場合方法ですが、 ps aux | grep processA | gawk '{print $2}'` | wc -l
でこの帰り値が、0でないとき として if 分で、制御すべきでしょうか?(Whileなどで無限ループしたなかにif を配置)

なにかもっとシンプルな方法ないでしょうか?

157:login:Penguin
09/07/20 22:49:46 ODKc/pMj
ああ、改めて見たら
>>154にレスしてるみたいに見えるな。

158:login:Penguin
09/07/20 23:01:27 iUvo3V7o
>>156
以下でできるかも

変数=`pgrep プロセスA`
[ -n $変数 ] && date >> /home/log

159:login:Penguin
09/07/21 10:43:13 BO90gQOW
>>156
変数に入れる必要あるの?
pgrep processA >/dev/null && date >> /home/log

160:login:Penguin
09/07/21 23:11:34 xGYTho7h
pidof
とか使わんの?

161:login:Penguin
09/07/23 17:30:46 WFggSjQ8
ここで聞くべきか若干怪しいかと思うのですが、
sudo 経由した場合のみ、特定コマンド(たとえばps)を
一般ユーザ権限で利用させる方法ってないでしょうか?

ps をパーミッション700にしておき、
root以外は使用できなくなる状態へしたいのですが、
sudo 経由した場合のみ使わせたいと思ってます。

162:login:Penguin
09/07/23 18:06:19 P+5ig7CA
くだ質池

163:login:Penguin
09/07/26 07:44:48 FW8uMlXc
ttaファイルを再生するスクリプトを作ってみました。
一応ちゃんと動くのですが、、、

バックグラウンドで動かしているttaencがエラーで死んだ場合に
(単純な例では$1のファイルがない、とか)
playコマンドが入力を待ち続けてしまうのです。
何かよい方法ないですか?

#! /bin/sh -e

WAV=`mktemp -t $$.wav`
rm -f $WAV
mknod $WAV p
trap "rm -f $WAV" 0
ttaenc -o $WAV "$1" > /dev/null 2>&1 &
play -q $WAV > /dev/null 2>&1



164:login:Penguin
09/07/26 08:26:44 BwoYtVgZ
>>163
ifで$?を判定すればいいんじゃないかな

165:login:Penguin
09/07/26 09:00:23 VmbGTICm
>>164
コア吐いたらダメっしょ。

trapしたほうがよくね?

166:163
09/07/26 09:07:33 FW8uMlXc
>>163 自己レス

playとttaencを両方ともバックグラウンドにし、
ttaencをwaitすることでエラーを捕捉、必要ならplayを停止。
これで解決しました。


#! /bin/sh -e

WAV=`mktemp -t $$.wav`
rm -f $WAV
mknod $WAV p
trap "rm -f $WAV" 0
ttaenc -o $WAV "$1" &
DECODE_PID=$!
play -q $WAV > /dev/null 2>&1 &
PLAY_PID=$!
exec 2> /dev/null
wait $DECODE_PID || (kill -10 $PLAY_PID)

>>164
$?について調べたのですが、バックグラウンドプロセスには効かないようです。
でも、調べる過程で解決の発想を得られました。ありがとう!



167:login:Penguin
09/07/30 18:32:54 8kF2jsLv
シェルスクリプト初めて数日ですが、ファイルの書き換えやなんかは検索すると出てくるんですが
選択肢形式の作り方がいまいちわかりません。
lokkitやsystem-config-networkみたいな選択形式を作りたいのですが
何かヒントをいただけないでしょうか?

168:login:Penguin
09/07/30 18:37:48 3Jkdy3aR
>>167
whiptail とか?

169:login:Penguin
09/07/30 19:33:48 1ZQVAEXh
dialog

170:login:Penguin
09/07/30 19:43:13 fH5JNdXj
$ lokkit
bash: lokkit: command not found
$ system-config-network
bash: system-config-network: command not found
$ whiptail
bash: whiptail: command not found
はう??

$ xmessage -button 'nipple,ass' 'which?'


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5367日前に更新/221 KB
担当:undef