シェルスクリプト総合 その14at UNIX
シェルスクリプト総合 その14 - 暇つぶし2ch2:名無しさん@お腹いっぱい。
09/01/29 06:55:25
□関連スレ:
sed
スレリンク(unix板)
正規表現
スレリンク(unix板)
おまえら! shell は何を使っているんですか?
スレリンク(unix板)
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
スレリンク(unix板)

□初心者向けリンク
「誰にでも」シリーズ
URLリンク(kanji.zinbun.kyoto-u.ac.jp)
/bin/shプログラミング入門
URLリンク(freebooks.info.nara-k.ac.jp)
シェルを使おう - 導入からプログラミングまで -
URLリンク(www.netfort.gr.jp)

□入門者向け書籍:
プロフェショナルシェルプログラミング
URLリンク(www.amazon.co.jp)
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
URLリンク(www.amazon.co.jp)
UNIXシェルプログラミング徹底解説
URLリンク(www.amazon.co.jp)
入門Kornシェル
URLリンク(www.amazon.co.jp)
入門bash
URLリンク(www.amazon.co.jp)

3:名無しさん@お腹いっぱい。
09/01/29 06:56:21
□参考リンク:
UNIXの部屋 (沢山のコマンドの簡単な紹介など)
URLリンク(x68000.q-e-d.net)
POSIX: Shell & Utilities (標準規格)
URLリンク(www.opengroup.org)

□最近のシェルスクリプト本(1)

(2004/03) UNIXシェルスクリプトハンドブック 関根 達夫 (著)
URLリンク(amazon.co.jp)
(2004/10) UNIXシェルスクリプト逆引き大全333の極意 中橋 一朗 (著)
URLリンク(amazon.co.jp)
(2004/11) 仕事に使えるLinuxシェルスクリプト 千葉 真人 (著)
URLリンク(amazon.co.jp)
(2004/12) UNIXシェルスクリプトサンプルブック デイブ・テイラー (著)
URLリンク(amazon.co.jp)
(2005/02) シェルスクリプト基本リファレンス 山森 丈範 (著)
URLリンク(amazon.co.jp)
(2005/04) LinuxWorldスクリプト 月刊リナックス・ワールド総集編 月刊LinuxWorld特別 (著)
URLリンク(amazon.co.jp)
(2005/05) UNIXシェルスクリプトコマンドブック 山下 哲典 (著)
URLリンク(amazon.co.jp)
(2005/05) わかる&使える UNIX基礎講座 シェルスクリプト編 中井 獏 (著)
URLリンク(amazon.co.jp)


4:名無しさん@お腹いっぱい。
09/01/29 06:57:24
□最近のシェルスクリプト本(2)
(2005/07) UNIX シェルスクリプト辞典 川井 義治 (著)
URLリンク(amazon.co.jp)
(2005/08) シェルスクリプト ポケットリファレンス bash編 宮原 徹 (著), 川原 龍人 (著)
URLリンク(www.amazon.co.jp)
(2005/12) 図解でわかるLinuxシェルスクリプト・正規表現 小泉 修 (著)
URLリンク(www.amazon.co.jp)
(2006/01)詳解 シェルスクリプト アーノルド ロビンス (著), ネルソン・H.F. ベーブ(著), Arnold Robbins (原著), Nelson H.F. Beebe (原著), 日向 あおい (翻訳)
URLリンク(www.amazon.co.jp)
(2007/3) Linuxシェルスクリプトユーザー便利帳―bash2/bash3対応 伊藤 幸夫 (著), 寒川 陽美(著)
URLリンク(www.amazon.co.jp)
(2007/9) ゲームで極める シェルスクリプトスーパーテクニック 山森 丈範
URLリンク(www.amazon.co.jp)
(2007/10) UNIX/Linuxシェルスクリプトマスタリングハンドブック 野川 准子
URLリンク(www.amazon.co.jp)

5:名無しさん@お腹いっぱい。
09/01/29 06:58:02
□関連書籍と関連リンク:
FreeBSD Hypertext Man Pages
URLリンク(www.freebsd.org)
Linux JF (Japanese FAQ) Project.
URLリンク(www.linux.or.jp)
Unix Programming Frequently Asked Questions 日本語訳
URLリンク(www.adl.nii.ac.jp)
UNIXプログラミング環境
URLリンク(www.amazon.co.jp)

□人間初心者へのお願い:
・このスレはシェルスクリプトについてのスレです。
 シェルの対話的な利用についての話やスクリプトと関係ないコマンドの
 使い方の質問などはスレ違いなので無用に願います。

□シェルスクリプトでよく使うコマンド:
制御・条件判定系: [,test,expr,true,false,yes,getopts
テキスト処理系: cat,awk,sed,tr,sort,uniq,grep,wc,head,tail,cut,paste,comm,join
ファイル検索系: find
(スペースなどを含むファイル名を正しく処理するため、
findは -exec command {} + を推奨。
他に -print0、xargsは -0オプションという方法もあるがSolaris非対応)
ディレクトリ系: basename,dirname
出力系: echo,printf
対話コマンド制御系: expect
http/ftpの処理自動化: wget,curl

6:名無しさん@お腹いっぱい。
09/01/29 07:56:09
>>1


7:名無しさん@お腹いっぱい。
09/01/29 08:11:03
いちおう前スレ

シェルスクリプト総合 その13
スレリンク(unix板)

8:名無しさん@お腹いっぱい。
09/01/29 12:03:55
freeコマンドのないOSでも実行できるような、
freeコマンド相当のシェルを作りたいと思っています。
具体的にはどう書けばいいですか?

できれば、bashに依存せず、汎用シェルになるようにお願いします。

9:名無しさん@お腹いっぱい。
09/01/29 12:48:30
シェルってゆうな。クズ。


10:名無しさん@お腹いっぱい。
09/01/29 12:53:43
テンプレ終了。では質問どうぞ。

11:名無しさん@お腹いっぱい。
09/01/29 18:16:43
>>8
busyboxというシェルが組み込みのfreeコマンドを持っています。

12:名無しさん@お腹いっぱい。
09/01/29 18:19:55
>>11
そのbosyboxとかいうシェルを具体的に書いて下さい。
1行目は
#!/bin/shでお願いします。

2行目以降は?

13:名無しさん@お腹いっぱい。
09/01/29 18:43:09
exit 0

14:名無しさん@お腹いっぱい。
09/01/29 18:44:53
>>12
#!/bin/sh
busybox free

15:名無しさん@お腹いっぱい。
09/01/29 18:49:36
引数も渡すならこんな感じ
#!/bin/sh
busybox free $*

16:名無しさん@お腹いっぱい。
09/01/29 18:52:52
>>14
えっと、何か勘違いされてますか?
シェル名はなんでもいいんですが、bosyboxとして

$ cat bosybox
#!/bin/sh
この行をお願いします
この行をお願いします
この行をお願いします
:


$ ./bosybox
…実行結果…


ということですが、、

17:名無しさん@お腹いっぱい。
09/01/29 19:01:29
vmstatあたりを sed awkして船山に登れば医院じゃないの?

18:名無しさん@お腹いっぱい。
09/01/29 19:08:49

なないかかんちがいてまちぇんでちゅか?


19:名無しさん@お腹いっぱい。
09/01/29 19:08:49
>>16
$ cat busybox
#!/bin/sh
/bin/busybox $*

$./busybox free
...

20:名無しさん@お腹いっぱい。
09/01/29 19:16:00
>>19
/bin/busybox というのはbash依存、またはOS依存だと思います。
どのOSにもあるコマンドだけを組み合わせてfree相当のシェルを作って下さい。

21:名無しさん@お腹いっぱい。
09/01/29 19:17:55
>>20
busyboxはbash依存でもなければOS依存でもありません。
freeが組み込まれたシェルです。

22:名無しさん@お腹いっぱい。
09/01/29 19:21:59
>>15
busybox内部の freeコマンドは、引数に対応してない。
あと、引数を渡すにしても $* で渡してはいけない。
(シェルスクリプトのコーディングルールとして)

よって失格。

23:名無しさん@お腹いっぱい。
09/01/29 19:24:23
>>22
そうなのか。フォローthx

24:名無しさん@お腹いっぱい。
09/01/29 19:25:16
>>20
無理

25:名無しさん@お腹いっぱい。
09/01/30 07:27:08
diffコマンドで2つのテキストファイルの中身を比較して、
一緒だったら次のAというコマンドを、違ったらBというコマンドを実行するには
どう書いたらいいですか?

26:名無しさん@お腹いっぱい。
09/01/30 07:35:41
>>25

if diff hoge.txt boke.txt > /dev/null
then
commandA
else
commandB
fi

27:名無しさん@お腹いっぱい。
09/01/30 07:42:04
完全一致でいいなら、diff >/dev/null よりも、cmp -s


28:名無しさん@お腹いっぱい。
09/01/30 07:45:05
>>27
>>25 「diffコマンドで」

29:名無しさん@お腹いっぱい。
09/01/30 07:50:34
>>26
diff文が使えるようなシェルってあるんですか?

うちのシェルはif文は if [ ... ] みたいに書く普通のシェルです。
普通のシェルでお願いします。

30:名無しさん@お腹いっぱい。
09/01/30 07:53:55
20/100点

31:名無しさん@お腹いっぱい。
09/01/30 07:58:05
if [ `diff a.txt b.txt | wc -c` == 0 ]; then
comA
else
comB
fi

だろ?

32:名無しさん@お腹いっぱい。
09/01/30 10:12:43
つまらんスレだな、ここは

33:名無しさん@お腹いっぱい。
09/01/30 10:58:24
>>29
その [ ... ] が何を示すのか勉強しなおしてこい

34:名無しさん@お腹いっぱい。
09/01/30 16:59:25
>>33
条件文を表してるのは知ってますよ

35:名無しさん@お腹いっぱい。
09/01/30 19:21:23
[ もdiffもコマンドってことじゃないかな
[ ... ]っつー見かけに惑わされちゃいかん

36:名無しさん@お腹いっぱい。
09/01/30 22:19:18
% where '['
[: shell built-in command
/bin/[

37:名無しさん@お腹いっぱい。
09/01/30 22:32:56
質問です。
2つのコマンド、commandA と commandB の標準出力同士を、
テンポラリファイルを作らずに diffコマンドで比較したい時、
bashなら、

diff <(commandA) <(commandB)

でできますが、
これを標準シェルでやるにはどうすればいいですか?

38:名無しさん@お腹いっぱい。
09/01/30 22:41:36
>>37
commandA | (commandB | diff /dev/fd/3 -) 3<&0

39:名無しさん@お腹いっぱい。
09/01/30 22:42:34
>>37
無理。
bash使うか、一旦ファイルに落せ。

40:名無しさん@お腹いっぱい。
09/01/30 22:47:41
答が出たあとで、無理とか言ってる奴ってなんなの?

41:名無しさん@お腹いっぱい。
09/01/30 22:57:08
>>38
おおでけた。THX!

42:名無しさん@お腹いっぱい。
09/01/30 23:32:55
>>34
その昔は、 /bin/[ なんてのが有ったんだがなぁ。


43:名無しさん@お腹いっぱい。
09/01/30 23:34:28
>>42
今でもあるだろ



44:名無しさん@お腹いっぱい。
09/01/30 23:38:21
>>42
今でもあるだろw

$ which '['
/usr/bin/[

45:名無しさん@お腹いっぱい。
09/01/30 23:50:58
Bシェルなのに which使う奴ってなんなの?

46:名無しさん@お腹いっぱい。
09/01/30 23:52:10
>>45
すまん、BSD育ちなんだw

47:名無しさん@お腹いっぱい。
09/01/30 23:59:24
昔はshにtypeなんてなく、whichは外部コマンドだった。
cshはaliasとかがあるせいでwhichを内部コマンドに持った。

48:名無しさん@お腹いっぱい。
09/01/31 07:29:55
>>38
/dev/fd/3 って純正シェルでも使えるの??

49:名無しさん@お腹いっぱい。
09/01/31 13:15:29
シェルじゃなくてOSだろ?

50:名無しさん@お腹いっぱい。
09/01/31 13:41:51
>>49
なんでもいいから、結局使えるの??

51:名無しさん@お腹いっぱい。
09/01/31 13:58:32
レスしたら負けだ。

52:名無しさん@お腹いっぱい。
09/01/31 19:54:54
これは釣りですよね?
いくらなんでもそんな質問しないもんね?

53:名無しさん@お腹いっぱい。
09/01/31 20:15:42
一般論として、/dev以下のファイルはシェルによって特別扱いされることが
あり得る。

例えば、bashだと、/dev/stdout とかは、実際の /dev/stdoutを読まずに
シェルが /dev/stdoutという文字列を特別扱いして動作する。

そのことを考慮すれば、/dev/fd/n がシェルに依存しているかも知れないと
考えることにも一定の合理性が認められる。

54:名無しさん@お腹いっぱい。
09/01/31 20:59:54
無いからもう寝ろ

55:名無しさん@お腹いっぱい。
09/02/01 00:46:46
こうしてスレに平和が戻った。。。end

56:名無しさん@お腹いっぱい。
09/02/01 02:18:13
[ を条件文だと言ったり、/dev/fd/3 がシェルに依存していると言ったり、
面白い人が増えたなw

57:名無しさん@お腹いっぱい。
09/02/01 08:04:35
>>56
/dev/fd/3 がシェルに依存してるのは本当だよ。

58:名無しさん@お腹いっぱい。
09/02/01 08:23:14
>>56

man bash | less -p /dev/fd/fd

man zshmisc | less -p /dev/fd/n

if file is of the form `/dev/fd/n',
where n is an integer, then the test applied to the open file whose
descriptor number is n, even if the underlying system does not support
the /dev/fd directory.


> even if the underlying system does not support the /dev/fd directory
> even if the underlying system does not support the /dev/fd directory
> even if the underlying system does not support the /dev/fd directory
> even if the underlying system does not support the /dev/fd directory

59:名無しさん@お腹いっぱい。
09/02/01 22:53:38
日本語でおk

60:名無しさん@お腹いっぱい。
09/02/02 04:47:50
bash(Fedora10)のシェルスクリプトでMS-DOSのバッチファイルのpuaseみたいな動作を
させるにはどのようにしたらいいですか?

61:名無しさん@お腹いっぱい。
09/02/02 06:25:59
>>60
read

62:名無しさん@お腹いっぱい。
09/02/02 10:24:22
>>60
bashの場合は read -n 1 の方がよりpauseの動作に近いかと

63:名無しさん@お腹いっぱい。
09/02/02 22:25:23
>>61-62
質問欲嫁。それはpauseの動作。>>60 の質問はpuaseの動作。

64:名無しさん@お腹いっぱい。
09/02/03 00:09:20
アプリケーションを実行した時に入力を求められるような場合
どう処理すればよいのでしょうか?
応答に対して入力する値(番号など)決まっているという前提でお願いします

65:名無しさん@お腹いっぱい。
09/02/03 00:12:58
echo 1 | app

66:名無しさん@お腹いっぱい。
09/02/03 00:25:53
$ ttyrec x
$ app

$ exit
$ ttyplay x


67:60
09/02/03 02:44:31
レスありがとうございます

>>61-62
read -n 1が良さそうなのでこれを使ってみます

>>63
すみません。タイプミスですorz
正しくは「pause」です

68:名無しさん@お腹いっぱい。
09/02/03 09:03:27
>>64
expect

69:名無しさん@お腹いっぱい。
09/02/03 15:36:11
expect使うけどセキュリティ考えたら微妙

70:名無しさん@お腹いっぱい。
09/02/05 00:30:20
bashで多重配列って使えますか?

71:名無しさん@お腹いっぱい。
09/02/05 00:35:26
>>64
conquerer -bj --creeping-deth

72:名無しさん@お腹いっぱい。
09/02/05 06:38:09
>>70
多次元配列という意味なら、使えない。

73:名無しさん@お腹いっぱい。
09/02/05 18:40:06
速度という観点でsh、bashそれとperl、pythonを比較するとどうなんでしょう。
起動コストは抜きにして
とりあえずディレクトリーをたぐりながら正規表現での文字列探索みたいなジャンルで
好みでもかまわないので意見がききたいです。


74:名無しさん@お腹いっぱい。
09/02/05 18:52:19
>>73
実際にやってみればいいじゃん。
まあシェルスクリプトは速度を求めるものじゃないけどね。

75:名無しさん@お腹いっぱい。
09/02/05 18:53:41
>>73
速い順に、
sh > perl > bash > python
で、大体合ってる

76:名無しさん@お腹いっぱい。
09/02/05 19:03:08
sh, bashは他のプログラムをfork, execしなきゃならないから
perl, python > sh, bash だろ。JK

77:名無しさん@お腹いっぱい。
09/02/05 20:23:44
シェルにもなって正規表現爆速のTcl最強って話ですね、わかります

78:名無しさん@お腹いっぱい。
09/02/06 12:09:09
Command-line Fu < The best UNIX commands on the web
URLリンク(www.commandlinefu.com)

79:名無しさん@お腹いっぱい。
09/02/06 12:18:34
-Fuってどういう由来の語なんだろうね

80:名無しさん@お腹いっぱい。
09/02/06 12:19:50
符じゃないか?

護符とかの。

81:名無しさん@お腹いっぱい。
09/02/06 12:51:06
URLリンク(ja.wikipedia.org)
なお、Script-Fuの名はカンフー(Kung-fu)からきている。

82:名無しさん@お腹いっぱい。
09/02/06 15:28:51
夫は男らしいさまを表す字です。
偉丈夫、気丈夫、大丈夫

83:名無しさん@お腹いっぱい。
09/02/06 15:34:19
PC的にアレかもね

84:名無しさん@お腹いっぱい。
09/02/06 15:57:59
例えばfindやgrepをshが呼び出す場合別プロセスで使っていたら
起動コスト安くなりませんか?めんどいけど
Tclってきるつもりだったけれどある程度の機能がセットになっているのならば
選択肢なのかなぁ。
でも要するにざっくりとみたら対さないんだったら素直にperl使うのが楽なんですかね、

85:名無しさん@お腹いっぱい。
09/02/06 16:11:31
tcl, perl
いつの人ですか?
ここ3年くらい使ったことないよ!

86:名無しさん@お腹いっぱい。
09/02/06 17:36:19
tcl なんぞより Bourne Shell の方がよっぽど古いぞと問い詰めたい


87:名無しさん@お腹いっぱい。
09/02/06 23:17:30
echo < hoge
これってhogeの内容がechoに渡されると思うんだけど、
なんで何も表示されないんですか?

88:名無しさん@お腹いっぱい。
09/02/06 23:30:30
echoはコマンド引数を表示するように作られていて、標準入力は読まないからです。

89:名無しさん@お腹いっぱい。
09/02/06 23:45:25
>>88
了解しました

[ana@coppola ~]$ echo <(ls)
/proc/self/fd/63

ではこうなるのはいったいなぜですか?
というか、
/proc/self/fd/63
って?


90:名無しさん@お腹いっぱい。
09/02/07 00:16:57
/dev/fd/#は#に対応するファイルディスクリプタに名前が付いたものと思えばいいです。
<(command)はprocess substitutionというbashの特殊な記法でファイルディスクリプタ
ファイル(/dev/fd/#)名に置換されます。

91:名無しさん@お腹いっぱい。
09/02/07 00:43:49
初期のシェルにもその記法はあったが、
曖昧さがあるので|記法に変った。

92:ミジンコ未満
09/02/07 01:17:25
bashのスクリプトでDVD/CDドライブにメディアが挿入されている場合に
コマンドを実行する。なんてことをするにはどうすればいいですか

93:名無しさん@お腹いっぱい。
09/02/07 01:32:22
Linuxならここの/procで。
URLリンク(www.linux.or.jp)

94:名無しさん@お腹いっぱい。
09/02/07 11:06:58
>>92

head -c 1 /dev/cdrom > /dev/null 2>&1 && command


>>93
そのリンク見ても、メディアが挿入されてるかどうかの判定はできないよ。

95:名無しさん@お腹いっぱい。
09/02/08 00:47:14
あるフォルダに複数のファイルが入っていて、その中から
暗号化zipを別のフォルダに分けるっていう事、どうやればいいでしょうか

96:名無しさん@お腹いっぱい。
09/02/08 00:49:33
お前、その質問を他人から受けてやりたい事が解るのか?

97:92
09/02/08 01:19:09
>>93-94
ありがと
なんとかなりそうです

98:名無しさん@お腹いっぱい。
09/02/08 02:15:27
2つのディレクトリ内のファイルの更新日時を比較するにはみなさんどうしていますか?
現状では、2つのディレクトリ内のファイルは同期が取れていますが、たまに異なる更新日時のファイルが出来ます。
その同期の取れていないファイルはできれば抜き出したいです。
ファイルは全部で5000件くらいあります。

1.ls -ltでディレクトリ内一覧情報を出してファイルに出力
2.出したファイルから不要な情報を削除(ユーザー名とか)して時間とファイル名だけにしぼる
3.上の1と2を両ディレクトリで行う
4.diffでファイル同士比較
5.偏った情報を出力

これをシェルでやらせようと思ってますが、どうも効率を悪い気がします。

99:名無しさん@お腹いっぱい。
09/02/08 03:18:26
結局何をしたいのか
ところどころ日本語も意味不明

更新日時の比較なら、ls -lt の結果を比較すればいいし
ファイル内容の比較をしたいのなら、diff や dircmp で
ディレクトリを指定すればいい


100:98
09/02/08 04:46:20
>>99
ありがとうございます。
おとなしく更新日時を取ってきてdiffで比較します。

101:名無しさん@お腹いっぱい。
09/02/08 07:23:22
>>98
なぜ同期ツールを始めから使わないのか?
e.g. rsync等

102:名無しさん@お腹いっぱい。
09/02/08 16:13:21
readlinkコマンドがないOSで、
readlink相当のことをシェルでやるには、
どうやるのが定番ですか?

シンボリックリンクの中にはスペースや特殊記号等、
すべてアリの状態でお願いします。

103:名無しさん@お腹いっぱい。
09/02/08 16:17:18
シェルってゆうな。クズ。

104:名無しさん@お腹いっぱい。
09/02/08 16:26:43
ls -l で行末を読むとか

105:名無しさん@お腹いっぱい。
09/02/08 16:57:46
>>104
> シンボリックリンクの中にはスペースや特殊記号等、
> すべてアリの状態でお願いします。

106:名無しさん@お腹いっぱい。
09/02/08 17:05:41
>>104

$ ln -s 'hoge -> hage' 'boke -> kasu'
$ ls -l
lrwxrwxrwx 1 guest guest 12 Feb 8 17:05 boke -> kasu -> hoge -> hage

こういう状態で、どうやって判定するのかね?

107:名無しさん@お腹いっぱい。
09/02/08 18:26:11
>>102
perl -e "print readlink ファイル名;"
でどう?
perl はたいてい入ってるし

108:名無しさん@お腹いっぱい。
09/02/08 22:41:27
>>104
lrwxrwxrwx
一文字目の l はどういう意味?

109:名無しさん@お腹いっぱい。
09/02/08 22:45:41
>>108
お前、>>105 が言わんとしてることをわかってない

boke -> kasu -> hoge -> hage

この部分を見て、どこがシンボリックリンクの中身か判読できないだろw

110:名無しさん@お腹いっぱい。
09/02/08 22:50:11
>>108
>>106 を良く読め、

ls -lの結果が、 boke -> kasu -> hoge -> hage となった場合、

「hage」を指している 「boke -> kasu -> hoge」と言うsymlinkかも知れないし、
「hoge -> hage」と言うファイルを指している 「boke -> kasu」と言うsymlinkかも知れないし、
「kasu -> hoge -> hage」と言うファイルを指している 「boke」と言うsymlinkかも知れない、
ということだな。

111:名無しさん@お腹いっぱい。
09/02/08 23:26:17
わかってない奴が湧いてるな

112:名無しさん@お腹いっぱい。
09/02/09 00:30:15
#!/bin/sh
(
echo a
echo b
)

これと

#!/bin/sh
{
echo a
echo b
}

これってなんか違いあります?

113:名無しさん@お腹いっぱい。
09/02/09 04:42:06
プロセスを起動するかどうか

114:名無しさん@お腹いっぱい。
09/02/09 06:32:24
>>113
実際にはシェル内部で最適化されるから、
( ) を使ってもプロセスは起動されない。

>>112
これだけだと違いは起きない。
( ) や { } 以外の他の部分の記述によっては違いが出ることもあるというだけ。

115:名無しさん@お腹いっぱい。
09/02/09 23:28:32
>>106
ls -l と ls -lF の結果を比較すればできそうだから、あとはまかせた。

116:名無しさん@お腹いっぱい。
09/02/10 04:06:30
readlink(1)ってのもあるよ。

117:名無しさん@お腹いっぱい。
09/02/10 06:44:56
>>116
>>102
「readlinkコマンドがないOSで、」

最近、質問をちゃんと読まない人多いね

118:名無しさん@お腹いっぱい。
09/02/10 09:48:36
ほんと、問題を良く読まないのが沢山いるな。
>>102はreadlink相当のことをビルトインコマンドとして持っているシェルを
探しているんだぞ。

>>102
> readlink相当のことをシェルでやるには、


119:名無しさん@お腹いっぱい。
09/02/10 09:58:01
readlink がなければ stat -f %Y を使えばいいじゃない

120:名無しさん@お腹いっぱい。
09/02/10 10:00:52
>>119
readlinkがないOSにはstatもないと考えるのが妥当。

あと、stat -f というオプションはFreeBSD方言だから気を付けろ。

121:名無しさん@お腹いっぱい。
09/02/10 11:04:50
stat --printfの"%N"はシェルスクリプトで使いづらいよな。

$ stat --printf "%n\n" /vmlinuz
/vmlinuz
$ stat --printf "%N\n" /vmlinuz
`/vmlinuz' -> `boot/vmlinuz-2.6.27-11-generic'

->とかquoteとかいらねーよ

122:名無しさん@お腹いっぱい。
09/02/10 13:20:19
>>120
マリー アントワネットにマジレスする不粋

123:名無しさん@お腹いっぱい。
09/02/10 15:07:27
>>122
おれには>>119 がマジで stat -f %Y が他のOSでも使えると思い込んでるように見えるが、

124:名無しさん@お腹いっぱい。
09/02/10 15:15:42
ビルトインコマンドとしてstat -fを持ってるシェルはどれだ?

125:名無しさん@お腹いっぱい。
09/02/10 15:46:31
>>123
しゅぎょーが足らないな

126:名無しさん@お腹いっぱい。
09/02/10 16:08:23
>>125
言い訳見苦しい。本当に知らなかったんだねw

127:名無しさん@お腹いっぱい。
09/02/10 16:12:10
readlink って、ファイル名がわかっているときしか使えないんだろ。
ファイル名がわかってるなら、ls -l を解析できるんじゃないか?

lrwxrwxrwx 1 guest guest 12 Feb 8 17:05 boke -> kasu -> hoge -> hage
ファイル名が boke ならば 'kasu -> hoge -> hage'
ファイル名が 'boke -> kasu' ならば、 'hoge -> hage'
が取り出せればいいんじゃないの?



128:名無しさん@お腹いっぱい。
09/02/10 21:01:33
シェルはリロードには対応してないんでしょうか?
たとえば、lsって打ちますよね、
で、hoge1 hoge2 とか表示されます。
そのあと、rm hoge1 ってやっても、
上の ls のところのシェルには hoge1 が表示されたままになります。
もう一回 ls を売っても、下の画面に2重に出てきて、
上のシェルの ls が更新されません

129:名無しさん@お腹いっぱい。
09/02/10 21:17:20
ひねりが足りない要努力

130:名無しさん@お腹いっぱい。
09/02/10 21:18:01
シェルに表示されたままという意味がよくわかりませんが、
端末の画面上ということですね。

CUIの端末の元祖はテレタイプです。
これはキーボードとプリンタがくっついたものです。
プリンタで打ち出されたlsの結果がいつのまにか変化するようなことはありません。
画面に表示するようになった現在でも同じです。

131:名無しさん@お腹いっぱい。
09/02/10 21:30:20
>>130
プリンターは繋いでいません。
プリーンターを繋げばリロードが治るんでしょうか?
良くわかりませんが??

132:名無しさん@お腹いっぱい。
09/02/10 21:37:26
URLリンク(homepage1.nifty.com)
こういうのを購入して接続するとリロードが治るはずです。
どこで売ってるかは知らないので、がんばって探してください。
なければあきらめましょう。

133:名無しさん@お腹いっぱい。
09/02/11 00:05:14
ダイヤルなつかしい

134:名無しさん@お腹いっぱい。
09/02/11 09:36:33
>>102

#!/bin/sh

echo 'b[9];main(int c,char**v){printf("%.*s?n",readlink(v[1],b,36),b);}'|gcc -xc - 2>/dev/null;./a.out "$1";rm a.out

135:名無しさん@お腹いっぱい。
09/02/11 09:37:18
あはははははは

136:名無しさん@お腹いっぱい。
09/02/11 10:46:40
>>134
ソースにじかに "$1" を入れ込めばもっと短くなるだろ

echo 'b[9];main(){printf("%.*s\n",readlink("'"$1"'",b,36),b);}'|gcc -xc - 2>/dev/null;./a.out;rm a.out

137:名無しさん@お腹いっぱい。
09/02/11 13:06:27
>>136
> 2>/dev/null

書き込めないcurrent directoryで、

/usr/bin/ld: cannot open output file a.out: Permission denied

すら見られませんが…

138:名無しさん@お腹いっぱい。
09/02/12 16:45:07
#!/usr/bin/tcc -run
b[9];main(int c,char**v){printf("%.*s\n",readlink(v[1],b,36),b);}

139:名無しさん@お腹いっぱい。
09/02/14 18:30:52
cpu使用率を出力するコマンドが欲しいんですがtopの出力を加工する感じになりますか?

140:名無しさん@お腹いっぱい。
09/02/14 18:32:02
>>139
uptime

141:名無しさん@お腹いっぱい。
09/02/15 01:04:50
vmstatとかじゃだめ?

142:名無しさん@お腹いっぱい。
09/02/15 02:12:42
>>139
/proc/statのcpu行の最初の三つがCPUタイム

143:名無しさん@お腹いっぱい。
09/02/15 09:42:44
ハードリンク先を求めるのに、findで探す以外に効率的なシェルって作れないんですか?

144:名無しさん@お腹いっぱい。
09/02/15 09:44:20
シェルってゆうな。クズ。

145:名無しさん@お腹いっぱい。
09/02/15 09:56:36
To find the hard links, is there some way to make an efficient shell without find ?

146:名無しさん@お腹いっぱい。
09/02/15 10:30:18
ファイルから全文を読み込んで、別ファイルに(追記で)書き込むにはどんな記述を
すればいいですか?
phpで言えば
$hen01 = $_POST["読み込んだ文字"];
$fp = fopen('書き込み先.txt', 'a+');
flock($fp, LOCK_EX);
$return = fputs($fp,"$hen01\n");
flock($fp, LOCK_UN);
fclose($fp);
こんな感じで一旦あるテキストファイルの文字列を全部読み込んで、別のファイルに
追記書き込みの処理をしたいんです。



147:名無しさん@お腹いっぱい。
09/02/15 10:40:05
cat aaa >> bbb

148:名無しさん@お腹いっぱい。
09/02/15 10:47:30
>>147

なるほどcatを使うんですね、即レスありがとうございました。

149:名無しさん@お腹いっぱい。
09/02/15 11:00:11
">>"がキモだとわかっているのだろうか。

150:名無しさん@お腹いっぱい。
09/02/15 11:12:06
ふむ、慣れない内はシェルに>の動作を制限させとった方がいいかも?
でも制限させたらさせたで面倒なんだよな。
仕事で使うんならいざしらず、遊びで使うんなら
少々飛ばそうが関係ないし。

151:名無しさん@お腹いっぱい。
09/02/15 11:18:56
シェルの話はスレ違い

152:名無しさん@お腹いっぱい。
09/02/15 11:23:28
>>147
それだと、>>146 のphpでやってる flock の処理が出来てないと思うが。
同時にプロセス起動されたら出力がぐちゃぐちゃに混ざる。

153:名無しさん@お腹いっぱい。
09/02/15 11:30:38
phpは知らんが146はロックできなかった場合の処理をしてないようなので
147でいいんじゃないの?

154:名無しさん@お腹いっぱい。
09/02/15 11:35:22
>>153
ロックできなかった場合はflockのところでロック解除になるまで待たされる。
だから、ロックの処理はちゃんと行なわれている。

よって >>147 ではダメ。

155:名無しさん@お腹いっぱい。
09/02/15 11:43:02
>>153
>phpは知らんが

知らないのに突っ込むと恥をかくという典型例ですな

156:名無しさん@お腹いっぱい。
09/02/15 11:50:00
そもそも >>146 の文章とコード例がずれてるのが原因のような

157:名無しさん@お腹いっぱい。
09/02/15 12:01:31
lockf bbb sh -c "cat aaa >>bbb"

lockf(1)が無かったら作れ。

158:名無しさん@お腹いっぱい。
09/02/15 12:04:49
>>146
flock(1)が存在するOS (Linux)なら、

flock out.txt cat in.txt >> out.txt

159:名無しさん@お腹いっぱい。
09/02/15 12:18:35
凄く細かいことを言うと、
>>157のスタイルの方が>>158のスタイルより、
ファイルロック以前に書き込まれる恐れがない。

160:名無しさん@お腹いっぱい。
09/02/15 12:21:59
おれも、それを指摘しようと思ったがアペンドだから問題ないので止めた。
>>158が知っていたのかはわからない。

161:名無しさん@お腹いっぱい。
09/02/15 12:26:13
158 だが、知ってた上で無駄な sh -c を外したんだよ。

162:名無しさん@お腹いっぱい。
09/02/15 12:28:31
無駄ではなく、過剰仕様というのなら分かるが…

163:名無しさん@お腹いっぱい。
09/02/15 12:32:41
>>162
いや、仕様とか品質とか関係なく無駄。

アペンドで先にオープンされるだけであって、
実際の書き込みはロック取得後に行なわれるから、
sh -c なしで全く問題ない。

164:名無しさん@お腹いっぱい。
09/02/15 12:35:16
>>157
それだと、実行後に bbbが削除されるだろ(笑)

>>158
こっちは合格。

165:名無しさん@お腹いっぱい。
09/02/15 17:50:43
146です。もう一つお尋ねしたいのですが次のような処理をシェルスクリプトで
する事は可能でしょうか?

1、a.txtの中に文字列「/var/log/maillog」が記述されている

2、シェルスクリプトを使って「/var/log/maillog」を記憶(変数にセット?)

3、b.txtに記憶した「/var/log/maillog」の文字列を追記したい

なおa.txtの内容は、
/var/log/maillogだったり/var/log/http_error_logだったりしますが、原則一行であり、
後ろの文字列は変わることはあっても先頭部分の/var/log/は不変です。


166:名無しさん@お腹いっぱい。
09/02/15 17:56:26
>>165
一旦変数に記憶させたいという要求なのかな?
だとすると、

file=`cat a.txt`
echo "$file" >> b.txt

なお、変数に記憶させる必要がなければもちろん、
cat a.txt >> b.txt でよい。

167:名無しさん@お腹いっぱい。
09/02/15 19:20:20
>>166
ありがとうございました、少し形を変えましたが思っていた事ができました。
こういう場合は``でくくるのですね。また一つ勉強になりました。

168:143
09/02/15 20:48:50
答えまだですか?

169:名無しさん@お腹いっぱい。
09/02/15 21:44:12
>>143
>>144

170:名無しさん@お腹いっぱい。
09/02/15 23:20:16
>>168
diagostini --autumn-leaves

171:名無しさん@お腹いっぱい。
09/02/15 23:42:59
>>168 >>143 ハードリンク先を求める
所詮、指してる先は i-node だから
ls -i 元ファイルのパス
じゃ、だめなのか


172:名無しさん@お腹いっぱい。
09/02/15 23:54:35
わかってない人は黙っているように。

173:名無しさん@お腹いっぱい。
09/02/16 00:31:33
自己解決しました。ありがとうございました。

174:名無しさん@お腹いっぱい。
09/02/16 09:15:29
スレ違いな気もしますが、解る方が居たらお願いします。
ユーザー登録用にシェルスクリプトを書いて、手動で実行すると普通に通るんですが
cronで実行すれば通らないんです。

ユーザー登録用のuseradd.shの内容は以下になります。

while read LINE
do
USER=`echo $LINE | sed -e 's/:.*$//'`
useradd $USER
echo $LINE | chpasswd
done < /home/xxxx/public_html/user_add.txt
exit

登録すべきユーザーの読み込み元のuser_add.txtはuser:passの形式でして、
手動でuseradd.shを走らせると普通に登録してくれるんですが、cron経由だと
ウンともスンとも言わず・・・

ただ、試行錯誤の末に気づいたんですが、デーモン再読み込みをさせる.shのの書き方で
service named reloadと書いて、手動で.shを実行すればOK、このスクリプトを
cronから実行すればNGだったんですが、/etc/rc.d/init.d/named reloadに書き直して
みたらcronから実行でも通りました。

rootで実行させて、かつパーミも権限あります。cronログはこのようになりました。
Feb 16 09:02:01 xxx crond[10113]: (root) CMD (/root/useradd.sh)

又、他の単純な.shは手動でもcronでも動きますので多分、cronは適正だと思います。
となると、やはりuseradd.shの記述がおかしい可能性が高いと思いますので、間違いなど
あればご指導お願いします。

175:名無しさん@お腹いっぱい。
09/02/16 09:35:31
#! /bin/sh -x
して何が起ってるか調べろ

176:名無しさん@お腹いっぱい。
09/02/16 09:37:07
たぶん$PATH

177:名無しさん@お腹いっぱい。
09/02/16 10:42:27
>>175-176
ありがとうございます、>>176の仰るとおり$pathでした。
useraddを絶対パスに指定してやって/usr/sbin/useraddにすればOKでした。


178:名無しさん@お腹いっぱい。
09/02/16 16:28:19
確かにスレ違いなんだが、
cronに書いてなかったっけ、$PASSの事。

179:名無しさん@お腹いっぱい。
09/02/16 16:37:59
$PASSの事は書いてない。

180:名無しさん@お腹いっぱい。
09/02/16 16:43:40
cronよりも、at使った方が楽で確実だよ。
コマンドライン上での実行時のPATHその他の環境変数が
実行時と同じように引き継がれて実行されるし。

181:名無しさん@お腹いっぱい。
09/02/16 16:51:37
>>179
確かに書いてなかった。

182:名無しさん@お腹いっぱい。
09/02/17 01:20:42
aaa,111
bbb,222
ccc,333

みたいな、1対1のデータ定義のテーブルを作って、
これを1行ずつ
コマンド aaa 111
コマンド bbb 222
コマンド ccc 333
のように実行していきたいんですが、かっこよくかけなくてこんな感じになりました。

#!/bin/sh

list=" aaa,111 \
bbb,222 \
ccc,333 "

for n in $list
do
sono1=`echo $n | cut -d, -f1`
sono2=`echo $n | cut -d, -f2`

command $sono1 $sono2
done

特にcutがださいと思ってます。
美しい書き方教えてください

183:名無しさん@お腹いっぱい。
09/02/17 01:30:15
>>182
command `echo $n | sed 's/,/ /'`


184:名無しさん@お腹いっぱい。
09/02/17 01:31:59
for n in $list
do
IFS=,
echo $n | { read sono1 sono2 ; command $sono1 $sono2; }
done

185:名無しさん@お腹いっぱい。
09/02/17 02:15:31
>>184
すいません

186:名無しさん@お腹いっぱい。
09/02/17 02:16:40
途中送信しちゃた
>>184
{}これでくくっている意味がわからんのですけどなんででしょう?

187:名無しさん@お腹いっぱい。
09/02/17 06:29:27
>>186
{ }で括らなかったら echoのパイプが左のreadだけにしかかからないだろ
( )でもいいけどさ。

188:名無しさん@お腹いっぱい。
09/02/17 06:31:27
>>184
わざわざreadしなくていいよ。

IFS=,
command $n

だけで桶。

189:名無しさん@お腹いっぱい。
09/02/17 21:27:45
list定義の部分はかっこよくできないすかね?
hashとか構造体風な感じ

190:名無しさん@お腹いっぱい。
09/02/17 22:08:31
>>189
list= の部分も自分で自由に決めていいなら、
カンマにこだわらずに、↓ みたいにすればいいのでは。


#!/bin/sh

list='
aaa 111
bbb 222
ccc 333
'

set $list
while [ $# -ne 0 ]; do
command $1 $2
shift 2
done


一旦位置パラメータに setして、forじゃなくてwhileで、
shift 2で2つずつ回すのがポイント。

191:名無しさん@お腹いっぱい。
09/02/17 22:12:37
IFS=,
cat <<EOF | while read x y; do echo $x $y; done
aaa,111
bbb,222
ccc,333
EOF


192:名無しさん@お腹いっぱい。
09/02/17 22:18:34
IFSの仕様が良くわからん。

193:名無しさん@お腹いっぱい。
09/02/17 22:20:38
#!/bin/sh

list='aaa bbb ccc'
aaa=111
bbb=222
ccc=333

for arg in $list
do
eval command $arg \$$arg
done


194:名無しさん@お腹いっぱい。
09/02/17 22:23:19
>>190
>>191
ありがとうございます。

ちなみに、
>>191のような場合のwhileは

cat <<EOF | while read xy
do
echo $x $y
done
aaa,111
bbb,222
ccc,333
EOF


のようにインデント、改行つきでかけないもんでしょうか?



195:名無しさん@お腹いっぱい。
09/02/17 22:25:16
>>194
継続行使えばOK

cat <<EOF | while read xy \
do \
echo $x $y \

196:名無しさん@お腹いっぱい。
09/02/17 22:28:51
>>195
アフォか。\ などイラン。

あと、お前の解答の cat <<EOFは無駄。
無駄を省くと、



IFS=,
while read x y
do
echo $x $y
done << EOF
aaa,111
bbb,222
ccc,333
EOF


それより、>>190 方式がお勧め。

197:名無しさん@お腹いっぱい。
09/02/17 22:47:54
コードとデータが分離してるとかっこいいよね

#!/bin/sh

# aaa,111
# bbb,222
# ccc,333

IFS=,
grep '^# ' $0 | sed 's/^# //' | while read a b
do
command $a $b
done


198:名無しさん@お腹いっぱい。
09/02/17 22:51:14
元の質問 >>182 で、外部コマンドの cut がかっこ悪いって言ってるんだから、
>>197 はもっとカッコ悪い。grepもsedも使うなんて。

199:名無しさん@お腹いっぱい。
09/02/17 22:56:31
>>197 を添削してやるよ。
外部コマンドなしでできる。

#!/bin/sh

# aaa 111
# bbb 222
# ccc 333

while read a b c
do
if [ "$a" = '#' ]; then
echo $b $c
fi
done < $0

200:名無しさん@お腹いっぱい。
09/02/17 23:00:28
どっちにしても、うっかりコメント書いて、えらいことになりそうな

201:名無しさん@お腹いっぱい。
09/02/17 23:02:54
あははは

202:名無しさん@お腹いっぱい。
09/02/17 23:04:31
#define aaa 111
#define bbb 222
#define ccc 333
とかにする?

203:名無しさん@お腹いっぱい。
09/02/17 23:07:14
データをコードよりも後ろに持ってくれば、
コメントアウトする必要なくなるぞ。


#!/bin/sh

exec < $0
while read a; [ "$a" != exit ]; do :; done

while read a b
do
if [ "$a" != '' ]; then
echo $a $b
fi
done

exit

aaa 111
bbb 222
ccc 333

204:名無しさん@お腹いっぱい。
09/02/17 23:16:47
>>197
これはかっこいいですね!

でも使いたいけど、仕事のだから気がひけるなぁ


205:名無しさん@お腹いっぱい。
09/02/18 01:28:19
スクリプトの中からコマンドを抜き出す方法ってありますか?
たとえば、以下のようなスクリプトがあるとします

----------------------------
#!/bin/sh

echo hello
echo hello | grep hello
echo goodby | sed 's/goodby/hello/'
----------------------------

この中からコマンドをあらわす単語だけを抜き出したいんです。
(この場合だと、echoとgrepとsedがそれにあたりますが、これ以外のコマンドが存在する可能性もあります。


206:名無しさん@お腹いっぱい。
09/02/18 01:40:50
>>205
作ってみた
-----------------------
~$ cat test.sh
#!/bin/sh
echo hello
echo hello | grep hello
echo goodby | sed 's/goodby/hello/'
-----------------------
~$ cat hoge.sh
#!/bin/sh
for word in `cat test.sh`
do
type "$word" > /dev/null
if [ $? -eq 0 ]; then
echo "$word"
fi
done
-----------------------
~$ ./hoge.sh
#!/bin/sh
echo
echo
grep
echo
sed
's/goodby/hello/'
-----------------------
うーん、コマンドでないものまで出力されてる、、、


207:名無しさん@お腹いっぱい。
09/02/18 02:17:05
たとえば、
echo dog cat man
という行があったらどうするとか、
eval ls
という行があったらどうするとか、
l=l; s=s; $l$s
という行があったらどうするとか。




208:名無しさん@お腹いっぱい。
09/02/18 22:30:53
yes,
test,
[,
ummm,,,,

209:名無しさん@お腹いっぱい。
09/02/18 23:02:58
-xの出力を加工することを考えたけど、パイプ等で並列実行すると混じるので断念した。

210:名無しさん@お腹いっぱい。
09/02/20 22:59:42
質問ですがシェルスクリプトを用いて、aaa.txtの2行目にbbb.txtの文字を追記で
書き込みをするにはどんな感じに書けばいいのですか?

aaa.txt
1行目 名前はAAAです

bbb.txt
1行目 名前は関口です
2行目 名前は川原です
3行目 名前は遠藤です
これをシェルスクリプトを使用してbbb.txtを次のようにしたいのですが・・。
1行目 名前は関口です
2行目 名前はAAAです
3行目 名前は川原です
4行目 名前は遠藤です

説明が下手なのでわかりにくいですがよろしくお願いします。

211:名無しさん@お腹いっぱい。
09/02/20 23:01:30
>>205
一回実行してよいなら簡単に抜ける。
exec(2)をフックして、引数を調べれるか、OSによっては
/procみれば即判る。

212:名無しさん@お腹いっぱい。
09/02/20 23:05:35
実行結果で条件分岐してたら、実行させないとトレース出来ない。

213:名無しさん@お腹いっぱい。
09/02/20 23:54:56
>>210
text=`cat aaa.txt`
sed "2i$text" bbb.txt

あるいは

printf "2i\n$text\n.\nwq\n" | ed bbb.txt

214:名無しさん@お腹いっぱい。
09/02/21 07:17:26
>>211
それだと、if文とかcaseとかの分岐があった場合に
分岐しなかった方が抜き出せない。
内部コマンドが抜き出せない。

215:名無しさん@お腹いっぱい。
09/02/21 07:21:51
>>210
(head -1 bbb.txt; cat aaa.txt; tail -n +2 bbb.txt) > outfile.txt


>>213
sedのiの直後に改行がなくてもOKなのはGNU sed依存。

216:名無しさん@お腹いっぱい。
09/02/21 12:03:48
>>213 >>215
ありがとー!出来ました。今後応用していろいろとがんばってみます。

217:名無しさん@お腹いっぱい。
09/02/21 12:15:58
いわゆる「指定文字列探索」をshで(findとかsedとか組み合わせて)ささっとやるのは
どんな感じでやるのがよいのでしょう。
ループ組まないでやる方法があればベターです。
とりあえずそのディレクトリー内で得に拡張子はとわず
英文(例えばソース中の関数名とか#includeとか)程度でいいです。


218:名無しさん@お腹いっぱい。
09/02/21 12:17:59
>>217
grep -r のことか?

219:名無しさん@お腹いっぱい。
09/02/21 13:48:39
grep ってファイル自体を探索できるんですか
勘違いしていた。orz。良くmanよみますたい

220:名無しさん@お腹いっぱい。
09/02/21 14:02:15
「ファイル自体」って考えを止めて、
stdioによるストリームデータとして捉えてください。
シェルスクリプト処理の主な対象は。

221:名無しさん@お腹いっぱい。
09/02/21 14:06:18
>>220
意味がわからない

222:名無しさん@お腹いっぱい。
09/02/21 14:07:05
-rは純正grepには無いので使用禁止。

223:名無しさん@お腹いっぱい。
09/02/21 14:09:29
>>217
find . -type f -exec grep pattern {} +

ちっともシェルスクリプトじゃないな。find総合スレが必要? w

224:名無しさん@お腹いっぱい。
09/02/21 14:44:09
Solarisはいつになったら grep に -r を実装するんだろう。
あ、全員がopensolarisに移行すれば解決するのか。

225:名無しさん@お腹いっぱい。
09/02/21 15:07:19
SunOSもHP-UXも「どうせみんなGNUtools入れてんでしょウヒヒ」という姿勢だから

226:名無しさん@お腹いっぱい。
09/02/21 18:20:07
>>220 わかりやすい表現で書いただけなり
取り合えず同じディレクトリーないでいいので

grep -a 'キーワード' *.txt
みたいにしてみたんだけれど
これってshで書けば日本語通るけれどターミナルだと打てないのが不便

あとマッチしたファイル名を一回だけ表示したらファイル名だけ探索して次にいくようにするにはいかに書けば良いなり?

227:名無しさん@お腹いっぱい。
09/02/21 18:22:07
>>226
grep -rl 'キーワード' .

228:名無しさん@お腹いっぱい。
09/02/21 18:24:32
>>223 どこにキーワード入れていいのかわからん。orz

229:名無しさん@お腹いっぱい。
09/02/21 18:29:39
>>227 それそれ。ありやとうやんした。
日本語を探索する場合 いちいちshに書くの面倒なんだけど
どうやってんでしょう。各々方は

230:名無しさん@お腹いっぱい。
09/02/21 18:31:06
普通にコマンドラインから。
文字コードがアレな時はlgrep使ってる。

231:名無しさん@お腹いっぱい。
09/02/21 18:40:37
>>229
普通にコマンドラインに日本語入力してるけど。

逆に、なんでコマンドラインに日本語入力できないの?

232:名無しさん@お腹いっぱい。
09/02/21 19:05:15
>>231

x 入れてなきゃ出来ないだろ。
鯖なら普通いれてない。

まあ、鯖でコマンドラインから日本語をいれにゃならんのも想像しにくいが。

233:名無しさん@お腹いっぱい。
09/02/21 19:08:07
>>232
X 入れてなくても日本語入力できてるけど、、

あと、>>229 で、「shに書く」なら出来てるんだよね?
どうやって shに書いてるの?
それと同じ方法でコマンドラインに日本語入力するだけだが、、

234:232
09/02/21 19:24:51
>>233

>>229 がどうしてるのかは知らんが、
x の入っているマシンで書いて、scpだ。

これと同じ方法でコマンドライン入力するとなると、
ssh comannd args ってなことになるが、リモートでシェルの補完機能が
使えない状況ではその気になれない。

235:名無しさん@お腹いっぱい。
09/02/21 19:35:06
>>234
どんくさいね。

236:229
09/02/21 19:49:28
普通にデスクトップ環境です。(xfce)
これもfirefoxでカキコしてるし
gnome-terminal,Terminal,xtermいずれも日本語は表示するので
shの実行結果では日本語表示されます。

anthyでの変換画面はでるけれど変換終了すると日本語部分は表示されません。(ぴっとかはねられる)
コピペでもセレクションコピーでも同様
ただしnano等起動すればターミナル内でも日本語変換できます。
ちょっとスレの趣旨と別枠だけれど世間とは違うのですか。

237:229
09/02/21 19:50:59
むろんガチでダイアログ出すこともできるしperlを使う手もあるけれど
grepにそれはないでしょうということで一応質問しているわけであります。

238:名無しさん@お腹いっぱい。
09/02/21 19:58:16
>>236
ロケール設定とshellの設定とターミナルの設定の問題だが、
スレ違いなんで、くだ質スレで、
「コマンドラインで日本語入力したい」ときいてみてくれ。


239:名無しさん@お腹いっぱい。
09/02/21 20:09:13
>>234
その、Xが入ってるというマシンで日本語入力できてるなら、
xtermとかktermとか開いて、その中からsshでログインして、
ログイン先のシェルのコマンドラインに、ローカルのXの
いつもの入力方法で日本語入力できるだろ。

240:名無しさん@お腹いっぱい。
09/02/21 20:15:44
>>226
shってゆうな。クズ。

241:232
09/02/21 20:39:48
>>235

なら、どんくさくない方法を提示しろやカス。

242:名無しさん@お腹いっぱい。
09/02/21 20:40:57
canuumという単語を思い出したが意味は忘れた

243:名無しさん@お腹いっぱい。
09/02/21 20:48:37
>>236
> 変換終了すると日本語部分は表示されません。(ぴっとかはねられる)

というのは、ログイン先でLANG(またはLC_ALLとかLC_CTYPE)が
ちゃんと設定されてないのが原因。

EUC環境なら LANG=ja_JP.eucJPに、
UTF-8環境なら LANG=ja_JP.UTF-8に設定しろ。


あと、これとは別件だが、canuumやuumがある環境なら、
Xが全くなくてもcanuumを起動すれば直接日本語入力できる。

244:名無しさん@お腹いっぱい。
09/02/21 21:29:42
>>243
環境変数LANGによらず、シェルが8ビットコードに対応してないと
はじかれる。Solarisだと/bin/tcshは8ビット入力できなかった。

>>236 は別のシェルを使ってみるといいと思う

ただ、>>229 の「日本語を探索する場合」って漢字コードが混在していると
非常にやっかいなんだんだよね。昔 jgrep だか ngrep だかが fj.sources に
流れたような記憶があるけど、ああゆう漢字コードを変換する grep が欲しいかも

245:名無しさん@お腹いっぱい。
09/02/21 21:38:48
>>241
「なら」ってなんだよ。つながってねーぞ。クズ。

246:名無しさん@お腹いっぱい。
09/02/21 22:03:10
テラターム使って日本語入力すればぁ?
どうせUNIXはサーバー専用なんだろ?

247:名無しさん@お腹いっぱい。
09/02/21 22:04:20
>236だす
>>243 環境変数は全部(LANGもLC_ALLもLC_CTYPEも)ja_JP.UTF-8なり
アプリだと入力できるのでターミナルソフトの問題ではなく>>244
いうようにシェルの問題だと思ったのだけれど

ふと思いついてsudo xterm(sh)するとなぜかコピペはできて変換はできず
su(csh)だとコピペも入力もできた。
原因は解明できていないしファイラーからターミナル開いて探索ということはやりにくいけれど
オラ個人の設定の問題の様なのでこの件はもうきにしないでくれ
grepの基本がわかっただけでも充分に前進したよ。


248:名無しさん@お腹いっぱい。
09/02/21 22:06:00
>>246 UNIXはゲームしたり文章書いたりブラウジングしたりするパソコン用OS

249:名無しさん@お腹いっぱい。
09/02/21 22:09:04
UNIXはゲームサーバーになったり書いた文章保存するサンバサーバーだったり
ブラウジング用ウェブサーバーだったりするサーバー用OS

250:名無しさん@お腹いっぱい。
09/02/21 22:52:42
ちなみにターミナルで日本語打ち込めない対策はさすがにsuとか使えないので
perlで<STDIN>使うという最低の方法に逃げたです。これだとクリック起動で文字入力待ちしてPerlで組めばいいのに``でgrep呼んでしまいました。
単純な探索の場合処理的にはファイルをたぐるループ分perlで直接書くより速いと思います。

251:名無しさん@お腹いっぱい。
09/02/21 23:04:53
>>250
$ grep -f - -rl .

ってやれよ。すると、標準入力から読み込んだキーワードがgrepに使われる。
シェルのコマンド行じゃない標準入力なら日本語は通るはず。
日本語打った後は、改行直後に Ctrl-Dで終了。

252:名無しさん@お腹いっぱい。
09/02/22 00:34:27
>>244
だからlgrepがあるつーの。

253:名無しさん@お腹いっぱい。
09/02/24 23:14:27
シェルの中でexpectを使ってwinにtelnetしてbatを実行してるんですが、
当然文字コードが違う(EUCとSJIS)ので化けます。

LANGを途中変えても変わらないです。(ターミナルのせいだと思いますが)

化けないようにできますか?

254:名無しさん@お腹いっぱい。
09/02/24 23:19:46
>>253
・標準出力にパイプで | nkf -Se をかます
・ktermをSJISモードで開く

好きな方選べ

255:名無しさん@お腹いっぱい。
09/02/24 23:30:46
| iconv -f EUC-JP -t Shift_JIS


256:名無しさん@お腹いっぱい。
09/02/24 23:42:35
シェルってゆうな。クズ。

257:名無しさん@お腹いっぱい。
09/02/25 06:36:32
>>255
それ、-t と -f 逆だろ。

258:名無しさん@お腹いっぱい。
09/02/25 10:09:23
>>251 ほとんどすれ違いネタになっていたのにありがとうございます
grep -f - -rl .
後の日本語入力→改行→ctrl+dで探索スタートできました。(xterm)


259:名無しさん@お腹いっぱい。
09/02/25 15:12:52
ディレクトリ内にひとつしかファイルorディレクトリがない場合に
コマンドを実行しようと思い、

for dir in `find . -type d -maxdepth 1`
do
    test $(ls -1 $dir | wc -l) -eq 1 && command
done

このように書いてみたのですが、ディレクトリ名が空白で区切られて
しまいうまく動きません。
どのように対処したらいいでしょうか?

260:名無しさん@お腹いっぱい。
09/02/25 15:17:13
find . -type d -maxdepth 1 | while read dir
do
test $(ls -1 "$dir" | wc -l) -eq 1 && command
done


261:名無しさん@お腹いっぱい。
09/02/25 15:28:47
>>259

find . -maxdepth 1 -type d \
-exec sh -c 'for d;do [ $(ls "$d"| wc -l) -eq 1 ] && command; done' dummy {} +

262:名無しさん@お腹いっぱい。
09/02/25 16:21:38
>>260
ありがとうございます。readを使うと良いんですね。
無事目的の動作をさせることができました。

>>261
ありがとうございます。
-execはあまり使ったことがないのですが、最後の
done' dummy {} +
の意味がいまいち理解できませんでした。
よろしければ教えていただけますか?

263:名無しさん@お腹いっぱい。
09/02/25 16:26:36
readを使うと、\ を含むディレクトリ名が読めないとか、
(途中じゃなく)頭にスペースが付いてるディレクトリ名が読めないとか
問題が残るんだな。
その点も含めて解決するとなると、>>261 の解になる。

264:名無しさん@お腹いっぱい。
09/02/25 17:34:24
>readを使うと、\ を含むディレクトリ名が読めないとか、
>(途中じゃなく)頭にスペースが付いてるディレクトリ名が読めないとか

IFS= read -r


265:名無しさん@お腹いっぱい。
09/02/25 17:36:23
>>264
read -r は bash依存。

で、それやっても「改行入り」ディレクトリ名が正しく処理されない。
結局 >>261 一択。

266:名無しさん@お腹いっぱい。
09/02/25 17:48:53
read -r は posix じゃね?


267:名無しさん@お腹いっぱい。
09/02/28 18:54:04
基本的なことかも知れませんが、
キーボードを読んで分岐するバッチはどう書けば医院でしょうか?

268:名無しさん@お腹いっぱい。
09/02/28 19:04:18
バッチならset /pですね。でも板違いなので出てってください。

269:名無しさん@お腹いっぱい。
09/03/01 02:23:56
>>268
MSDOSのバッチスクリプトしか知らない人?
バッチって、バッチ処理等の普通名詞だろう

270:名無しさん@お腹いっぱい。
09/03/01 03:26:52
パスワードがかかってないzipファイルにパスワードをかけていきたいんですが、
そもそもパスワードがかかってないか判定するすべはありますか?

271:名無しさん@お腹いっぱい。
09/03/01 06:54:24
>>270
unzip -Zv *.zip | grep 'file security status'

272:名無しさん@お腹いっぱい。
09/03/01 08:06:08
cronもatも使えない環境で、指定日時時刻にシェルを実行するバッチって書けますか?

273:名無しさん@お腹いっぱい。
09/03/01 11:17:51
>>269
普通名詞のバッチ処理はユーザーからの入力待ちは行えない。必要な入力データは
あらかじめ用意しておく処理。対話処理とは対極的なもの。
ユーザーからの入力によって処理を変えたい「バッチ」というならMSDOSのバッチに他ならない。

274:名無しさん@お腹いっぱい。
09/03/01 11:20:52
>>272
指定時刻までの時間を計算してsleepする。

275:名無しさん@お腹いっぱい。
09/03/01 11:27:52
>>274
それはわかってますよ。その具体的なシェルを質問してるんですが。

276:名無しさん@お腹いっぱい。
09/03/01 11:29:40
echo -n 'xx時xx分xx秒までの時間を入力してください '
read t
sleep $t
command

277:名無しさん@お腹いっぱい。
09/03/01 11:32:04
すみませんが、詳しくご存知の方のみ御回答をお願いします

278:名無しさん@お腹いっぱい。
09/03/01 12:34:37
>>277
お前、何様のつもり?


279:名無しさん@お腹いっぱい。
09/03/01 12:42:54
こういうのがはやってるみたいよ

280:名無しさん@お腹いっぱい。
09/03/01 13:14:31
スレリンク(db板:188番)

これってシェルスクリプトで出来るんですか?

281:名無しさん@お腹いっぱい。
09/03/01 16:28:03
>>277 は多分質問者じゃない。
こういう荒らしを楽しんでる奴が最近いる。

282:名無しさん@お腹いっぱい。
09/03/01 18:03:41
そらできるよ

283:名無しさん@お腹いっぱい。
09/03/01 19:27:53
bashとawkって書いてあるじゃん

284:名無しさん@お腹いっぱい。
09/03/01 20:10:39
bashはわかりますが、awkって何ですか? bashのプラグインみたいなものとは思いますが


285:名無しさん@お腹いっぱい。
09/03/01 20:44:21
その認識でおk

286:名無しさん@お腹いっぱい。
09/03/01 21:02:50
工エエェ(´д`)ェエエ工

287:名無しさん@お腹いっぱい。
09/03/01 21:03:02
bashとawkでGUIができるの?

288:名無しさん@お腹いっぱい。
09/03/01 23:21:15
久々に笑った。
まさかbashのプラグインと来るなんてねえ。

289:名無しさん@お腹いっぱい。
09/03/02 09:25:51
>>287
GUI とhttp通信は別コマンドじゃないかな
awkを書いたのはCSVのparseに使ってるからだろうね

290:名無しさん@お腹いっぱい。
09/03/02 15:07:18
すみませんが、まったくの素人の方のみ御回答をお願いします

291:名無しさん@お腹いっぱい。
09/03/03 10:58:08
$ echo abcd def | read a
$ echo $a


echo の結果を read では変数にセットできない?

292:名無しさん@お腹いっぱい。
09/03/03 11:05:13
できるよ。
ただ、| のうしろはサブシェルになるので、
セットしてすぐサブシェルが終了して忘れるだけ。

echo abcd def | { read a; echo $a; }

ksh だとサブシェルにならないので↑のようにしなくてもふつーに動く。


293:名無しさん@お腹いっぱい。
09/03/03 11:43:30
なるほど、ありがと。
大人しくバッククォートで実行の結果使います。

294:名無しさん@お腹いっぱい。
09/03/04 23:31:09
cshのこと聞いてもいいですか?

295:名無しさん@お腹いっぱい。
09/03/05 00:18:50
>>1を読んでて答える人がいればいいんじゃない?
俺はcshは分からんが。

296:名無しさん@お腹いっぱい。
09/03/05 02:03:59
変数の最後入っている改行コードを取り除く方法ってありますか?
Perl の chomp をシェルでやりたいのです。

297:名無しさん@お腹いっぱい。
09/03/05 02:18:18
b="`echo $a`"

298:名無しさん@お腹いっぱい。
09/03/05 02:21:31
b="$(printf "%s" "$a")"すると連続した空白も保存

299:名無しさん@お腹いっぱい。
09/03/05 06:46:31
>>297 だとスペースが保存されないし、* とかの特殊記号が展開される。

b=`echo "$a"`
で桶。

300:名無しさん@お腹いっぱい。
09/03/06 00:52:11
>>295
ではだめもとで。

配列の
array=( "a 1" "b 2" "b 3")
をforで1要素づつ使いたい場合

for d in ${array[@]}
do
echo $d
done

とかできますよね

これをcshでやること可能ですか?


301:名無しさん@お腹いっぱい。
09/03/06 01:36:18
間違えた
for d in "${array[@]}"
do
echo $d
done

こうです。

302:名無しさん@お腹いっぱい。
09/03/06 06:41:00
foreach i ($array)
echo $i
end
だろ。

303:名無しさん@お腹いっぱい。
09/03/06 06:48:04
csh(笑)の質問はこっちでやれ
スレリンク(unix板)

>>302
それだと、要素の中のスペースで分割されてしまうからダメ。
例: "a 1" が a と 1 に別れてしまう。

304:名無しさん@お腹いっぱい。
09/03/06 09:42:48
そんなこと言うならbash()笑の質問もこっちでやれってことになるぞw
スレリンク(linux板)

305:名無しさん@お腹いっぱい。
09/03/06 22:26:43
>>300
cshなら配列使えばいいのでは?

#!/bin/csh -f
set a = ("a 1" "b 2" "c 3");

set i=1
while ( $i <= $#a )
   echo $a[$i]
   @ i = $i + 1
end


306:名無しさん@お腹いっぱい。
09/03/07 00:49:25
set name = value
とかイコール前後にスペース付けられるあたりはcsh悪くないよね

というかスペースを許さないbashの代入がちょっとどうかと思う。

307:名無しさん@お腹いっぱい。
09/03/07 01:10:08
なぜそこでbash

308:名無しさん@お腹いっぱい。
09/03/07 03:17:01
とつぜんbashがきたので・・・

309:名無しさん@お腹いっぱい。
09/03/07 07:01:04
>>306
算術式ならbashでもスペースを入れられるよ。

((i = 123))
echo $i

310:名無しさん@お腹いっぱい。
09/03/08 04:05:42
(())ってなんなの?

311:名無しさん@お腹いっぱい。
09/03/08 05:48:05
ま○こ

312:名無しさん@お腹いっぱい。
09/03/09 19:53:57
まi = 123こ
echo $i

313:名無しさん@お腹いっぱい。
09/03/10 07:44:38
sh, bashでシェル変数の値を変数名とするシェル変数を定義して
代入したいのですがどうすればよいでしょうか?
eval "$A=B"

eval "$A"=B
と書くと、意図通りに代入と判断されるシェル(最近のLinuxのbashやSolarisのsh)も
有ればコマンドと判断されてcommand not foundとなってしまう
シェルもあって、困っています。


314:名無しさん@お腹いっぱい。
09/03/10 08:24:35
>>313
一般的には、代入する値のスペースや記号の解釈を避けるには、

eval $A=?''代入する値'?'

と書いておけば桶。evalを含めた2回の解釈を回避するために、
シングルクォートを2回ネスティングする。
$Aの方は、中身は単純な変数名が入っているため、
裸の $A のままクォートしなくても桶。

Solarisのshで動くならそれが標準と考えて良い。
これで動かないようなシェルは捨てるべき。

315:名無しさん@お腹いっぱい。
09/03/10 08:27:12
>>313
わ、なぜかこの環境から書き込むと、
半角の\が?に化ける。(なんで?)
>>313 の?はバックスラッシュに読み変えてね。

316:名無しさん@お腹いっぱい。
09/03/10 08:59:21
>>313
具体的にどのシェルか言えよ
そのときだけ"$A"にスペースが入ってんじゃないの?

317:名無しさん@お腹いっぱい。
09/03/10 18:05:12
シェルスクリプトってOOじゃないんでしょ?
ダサっ

318:名無しさん@お腹いっぱい。
09/03/10 18:37:45
>>313
困っています、じゃあ独り言にしかなってないぞ。
動かない場合の代わりの方法が欲しいのか、
ネタを流してるのかハッキリしろ。

319:名無しさん@お腹いっぱい。
09/03/10 20:10:54
last(1)を去年の11月から今日まで出したいのですがどうすれば
いいでしょうか。

320:名無しさん@お腹いっぱい。
09/03/10 20:30:06
cat /var/log/wtmp.3 /var/log/wtmp.2 /var/log/wtmp.1 /var/log/wtmp.0 /var/log/wtmp >/tmp/wtmp
last -f /tmp/wtmp
rm -f /tmp/wtmp

場所が違えば適宜探すこと。
圧縮されてたら適宜伸長すること。
11月の分が存在しなければ諦めること。

321:名無しさん@お腹いっぱい。
09/03/11 02:00:46
>>314-315
ありがとうございます。
が、試してみたところエラーとなりました。

XX=YY形式の設定ファイルをIFS="="として、
while readで読み込んで、環境変数XX=値YYとしています。
whileブロックの外ではエラーがでないので、
IFS="="が悪さをしているのではないかとふと思いつきました。
明日試してみます。

>>316,318
bash3.2.25です。


322:名無しさん@お腹いっぱい。
09/03/11 06:29:23
>>321
エラーになってあたりまえだ。

IFS="=" にすれば、コマンド上では = が消えてしまう。
XX=YY は、実際には XX YY という風に実行され、エラーになる。

これは、「シェル変数の値を変数名とするシェル変数を定義して代入」
以前の問題。

「シェル変数の値を変数名とするシェル変数を定義して代入」の問題なら、
>>314-315 の回答で合ってる。

あと、bash-3.2.25かどうかは関係ないと思うぞ。
エラーが出るなら他のシェルでもエラーになるはず。

323:名無しさん@お腹いっぱい。
09/03/11 09:45:54
Windows PowerShellはOOなのに
シェルスクリプトはOOじゃないんだよね
時代遅れだね

324:名無しさん@お腹いっぱい。
09/03/12 07:21:25
>>323
PowerShell は最近生まれたものなんだから当然だろ。
比較するなら PowerShell と同時期に生まれたシェルと比較しろ。

325:名無しさん@お腹いっぱい。
09/03/14 01:53:46
jpgファイルのサイズを知りたいんですが、調べられますか?

326:名無しさん@お腹いっぱい。
09/03/14 02:09:29
はい

327:名無しさん@お腹いっぱい。
09/03/14 02:14:51
>>324
彼はLinux板のシェルスクリプトのところでも同じことを書いてたから。

328:名無しさん@お腹いっぱい。
09/03/14 02:20:53
>>325
imagemagickのidentifyコマンド


329:名無しさん@お腹いっぱい。
09/03/14 12:03:01
ls -lとかじゃないのか。

330:名無しさん@お腹いっぱい。
09/03/14 12:32:29
echo "jpgファイル" | wc -c

331:名無しさん@お腹いっぱい。
09/03/14 23:02:45
>>328
ありがとうございます。できました。

>>329
>>330
すいません。サイズという表現微妙でした。
解像度?1280x1024とかの値の話でした。

332:名無しさん@お腹いっぱい。
09/03/17 22:56:18
かなりてきとーだけど。

while read l; do
for w in $l; do
type $w > /dev/null 2>&1 && echo $w
done
done < (ファイル) | sort | uniq

333:名無しさん@お腹いっぱい。
09/03/18 19:31:29
>>325 >>331 X環境ならば
xfceのthunarだと画像ファイルを選ぶとステータスバーにサイズを表示する。
あとImageMagickいれるならば関連付けでdisplayにすれば良い
あとはperlなりcなりでperlmagickなりmagickwandなりでやりたい放題。

但しexifはdisplayでは対応しているけれどImageMagickのライブラリーは対応していないので
libexifとかexiftool入れると良いと思う

334:名無しさん@お腹いっぱい。
09/03/18 19:32:16
>>333 つまりこのスレ的にはexiftoolの返しをいかに削るかということだと思う

335:328
09/03/18 20:35:04
つ identify -verbose

336:名無しさん@お腹いっぱい。
09/03/19 01:52:23
削るとかよりも素直に
WIDTH=`identify -format '%w' image.jpg`
HEIGHT=`identify -format '%h' image.ipg`
じゃない?

337:名無しさん@お腹いっぱい。
09/03/21 00:05:33
>>336 元質問者の調べる楽しみを奪っちゃダメだよ。 >>335くらいでとどめておくのが良い
exifに手を出せばいろいろおもしろいんだから、すぐにmanとかで分かるし。
ijgのおまけの返しから削る手だってある。
ノーヒントならともかく「わかった」という喜びを与えてあげよう
それにshell script的には削って置換した方がおもろい。
選択肢が多く汎用性のあるものはいかにおもろいかが重要。

338:名無しさん@お腹いっぱい。
09/03/22 04:07:52
shcでできたCソースからshに戻すというのは楽しいですか?

339:名無しさん@お腹いっぱい。
09/03/22 08:11:40
>>338
俺がお前に聞きたいわ。

340:名無しさん@お腹いっぱい。
09/03/22 23:38:38
shcってechoはsystem("echo");とかに変えるんだろうか?

341:名無しさん@お腹いっぱい。
09/03/25 18:48:49
過去ログ見終わって今来た。ふぅ。

cshでさ、cshrcで
set path = (${path} ${TOMCAT_HOME}/bin)
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${TOMCAT_HOME}/lib
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${TOMCAT_HOME}/ROOT/WEB-INF/classes
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${TOMCAT_HOME}/ctx/lib:${TOMCAT_HOME}/jdbc/lib
って設定してて、気がつくと、
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin
LD_LIBRARY_PATH=:/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib
:/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib
:/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib
:/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib
みたいなことになってるけど、重複した同じパスの解消ってスクリプトで出来る?
なんだか検索で遅くなりそうだが、気にしないが現実的?

342:名無しさん@お腹いっぱい。
09/03/25 21:04:54
cshなんて使わないのが現実的
.cshrcでは setenvしない(setenvは .loginでする)のが現実的
setenvする場合でも、以前の値が蓄積するような書き方はしないのが現実的

cshの話題は
スレリンク(unix板)
に書くのが現実的

343:名無しさん@お腹いっぱい。
09/03/26 00:23:22
csh って何回も打つからそうなるんじゃない?
それならshでも同じことでしょ

存在しないコマンド打った場合はエラーが帰るのが多少遅くなりそうだけど・・

気持ち悪ければ、「;」を改行に変えて、sort -u して「;」戻して新たにPATHに突っ込めばよいのかもしれんけどそうすると元の順番と変わるなぁ

344:名無しさん@お腹いっぱい。
09/03/26 07:27:35
>>343
>それならshでも同じことでしょ

なんでやねん。アフォかw

shの .profile は「ログインシェル」しか読まない。
shって何回も打っても二重登録されない。

345:名無しさん@お腹いっぱい。
09/03/26 07:41:07
いや.shrcならさ

346:名無しさん@お腹いっぱい。
09/03/26 07:51:23
>>345
はぁ? .shrc なんてファイル何者?

少なくとも/bin/shはそんなファイルを読まない。
ash bash zsh ksh も .shrcなんてファイル読まないぞw

347:名無しさん@お腹いっぱい。
09/03/26 08:00:36
cshには .login ってファイルなかったっけ

348:名無しさん@お腹いっぱい。
09/03/26 08:04:57
>>347
>>342 が回答済み

349:名無しさん@お腹いっぱい。
09/03/26 14:58:19
>>341
普通に使ってたら、そんなことは起きない。

350:名無しさん@お腹いっぱい。
09/03/26 23:52:39
.shrcってないんだ・・
bashしか使わんから.bashrcみたいにあると思い込んでいたよ

351:名無しさん@お腹いっぱい。
09/03/27 01:18:27
マニュアル読まない奴は多いんだね

352:名無しさん@お腹いっぱい。
09/03/27 01:36:44
試してみない奴はもっと多い

353:名無しさん@お腹いっぱい。
09/03/27 12:34:12
初心者質問すいません。
スクリプトの中で変数が空かどうか調べるにはどう書けばよいでしょうか?
ご教示頂きたくm()m

354:名無しさん@お腹いっぱい。
09/03/27 12:44:24
>>353
変数名 HOGE が空かどうかを調べる

(1)空文字列は空とはみなさない場合:

echo ${HOGE-'空だよ'}

---
(2)空文字列がセットされていても空とみなしたい場合:

echo ${HOGE:-'空だよ'}

355:名無しさん@お腹いっぱい。
09/03/27 12:48:45
>>353
)空文字列も空と見做していいなら、

if [ -z "$HOGE" ]; then
: 空の場合の処理
fi

356:353
09/03/27 12:51:54
ありがとうございます!m(_ _)m

357:名無しさん@お腹いっぱい。
09/03/27 12:52:39
>>353
空文字列は空ではないと考えるなら、

if [ "${HOGE+a}" ]; then
: 空の場合の処理
fi

358:名無しさん@お腹いっぱい。
09/03/27 12:56:12
>>357
条件逆になってるよw

if [ -z "${HOGE+a}" ]; then
: 空の場合の処理
fi

359:353
09/03/27 15:36:18
ありがとうございます。
すいませんもう一個疑問が出来ました。
$1のような特殊変数には値の代入はできないのでしょうか??

360:名無しさん@お腹いっぱい。
09/03/27 15:38:12
つ set -- value1

361:名無しさん@お腹いっぱい。
09/03/27 15:52:22
>>359
× 特殊変数
○ 位置パラメータ

代入方法 ( $1 に HOGEを代入したいなら)
set -- HOGE
ただし、$2以降のすべての位置パラメータがリセットされる

他に、「特殊パラメータ」($0 $@ $# $? など)もあって、
特殊パラメータには値は代入できない。

362:名無しさん@お腹いっぱい。
09/03/27 17:23:22
>>357
「空文字列は空ではない」ってどういう意味??

HOGE+aってそんな変数できるの? 変数に足し算?
HOGE+bとかやるとなにか違い出るの?

全然わかりません><

363:名無しさん@お腹いっぱい。
09/03/27 17:28:37
unsetな状態を「空」って言うのか?

364:名無しさん@お腹いっぱい。
09/03/27 19:24:58
変数が無い
変数設定されてるが空。
変数に値が設定されている。

365:名無しさん@お腹いっぱい。
09/03/27 23:44:09
>>364
で、質問は何?
変数が必要なら設定すれば?

366:名無しさん@お腹いっぱい。
09/04/01 09:36:21
>>363
はいって何?
出来るの?
さっきから何度も。
はいって言葉の重みわかってる?
いま出来ますって断言したんだよ君。
その責任の重さわかってんの?
社会に出たらもっと自分の言葉に責任持てよ。
ん?
社会人の一言一言に掛かる責任の重さが分かってないだろ全然。
学生気分でやってんだったら帰ってもらうよ。
とにかく明日からもう来なくていいから。

367:名無しさん@お腹いっぱい。
09/04/01 12:44:33
説教の誤爆はいつ見ても滑稽だな。

368:名無しさん@お腹いっぱい。
09/04/01 14:58:19
誤爆つーかコピペ

369:名無しさん@お腹いっぱい。
09/04/01 15:53:48
今日から新人来るからな。
今までの下っ端が下っ端を抜け出せるかの試練の日。

370:名無しさん@お腹いっぱい。
09/04/01 16:14:02
CRONで別サーバーにファイルを転送しようとしています。
対話式で
ftp example.com
username
password
cd ディレクトリ
put ファイル
quit
とやると正常にファイルを送信することができます。

ftp -n example.com << __END__
user username password
bin
passive
cd ディレクトリ
put ファイル名
quit
__END__

をシェルスクリプトで実行すると
ファイル名: Permission denied.
と権限がない旨が表示されます。

転送元ファイルの権限はroot、パーミッションは0644、転送するファイル一般ユーザー権限、ディレクトリに変えてみたのですが、
結果は変わらずです。
実行ユーザーはroot、シェルスクリプトのパーミッションは0700です。
対話式とは権限周りが違うのでしょうか?

371:名無しさん@お腹いっぱい。
09/04/01 16:29:25
>>370
cronを使わずに、そのシェルスクリプトを一般ユーザーで実行して正常動作するなら、
NFSでrootの権限がない問題と思われる。
シェルスクリプトのパーミッションを755とかにすれば?

372:名無しさん@お腹いっぱい。
09/04/01 16:44:03
よくNFSだってわかったな。

373:名無しさん@お腹いっぱい。
09/04/01 16:56:37
put ファイル名 でエラーしたんじゃないの?

374:名無しさん@お腹いっぱい。
09/04/01 17:02:47
>>373
それだったらメッセージが違う。ftpdからのメッセージになるから、
5XX cannot write hoge とか。

375:370
09/04/01 17:06:33
一般ユーザーディレクトリにbackup.shを移し、一般ユーザー権限で
/bin/sh /home/ユーザーdir/適当なフォルダ/backup.sh

を実行しましたが、変わらずです。
backup.shのパーミッションは0755。

CRONでもコマンドライン上でも、シェルスクリプト経由でFTPを通すとエラーが出るようです。
一般ユーザー権限でも、対話式なら問題ありません。



376:名無しさん@お腹いっぱい。
09/04/01 17:12:24
CRONとか大文字で書いてるし、どうせ釣りだ

377:名無しさん@お腹いっぱい。
09/04/01 17:17:53
>>375
一般ユーザーで、

$ /bin/sh -x /home/ユーザーdir/適当なフォルダ/backup.sh

を実行した結果を省略せずに貼ると何かわかるかも。

378:名無しさん@お腹いっぱい。
09/04/01 17:34:55
>>377
そんなこと言って、「省略せずに貼」ったとたん、黙り込むんだよなぁ。
または、他の人が正解を回答して、結局、貼った内容は全く関係なかったり
するんだよなぁ。

379:名無しさん@お腹いっぱい。
09/04/01 17:38:59
>>370
その backup.sh の中の ftp -n を、ftp -nv に変えてメッセージを検証して。

380:名無しさん@お腹いっぱい。
09/04/01 17:39:14
>>374
試してみた?>>370 のようなエラーがでたよ
(Solaris8)

381:名無しさん@お腹いっぱい。
09/04/01 17:49:58
>>378
まぁあくまで「わかるかも」だからな。

382:370
09/04/01 18:17:08
遅くなりましたが解決しました。
原因はシェルスクリプト自体の権限が、FTPで接続するユーザート違かったからだと思います。

SSHでログインしているサーバーのユーザーは「root」の他に「admin」「information」などのユーザー名を使用していたのですが、FTPで接続する先のユーザーは全く違う名前でした。
なので、FTPのユーザー名と同じユーザーを作成し、そのユーザー権限でシェルスクリプトを実行したら、無事成功しました。

けど、FTPのユーザー名と、実行するユーザー名が異なると権限のエラーがでるのですね。 不思議です。

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

383:名無しさん@お腹いっぱい。
09/04/01 18:24:36
そんなはずないと思うんだがなぁ。

384:名無しさん@お腹いっぱい。
09/04/01 18:25:24
Cygwin(bash)を使っています。

for文の中で文字列の代入をさせようとするとエラーが返されます

#!/bin/sh

for i in *
do
  $output = $i
  (・・処理・・)
done

どうしたらfor文の中で文字列の代入をさせることができるでしょうか?

385:名無しさん@お腹いっぱい。
09/04/01 18:26:18
for の外なら

$output = $i

はできてるのか?

386:名無しさん@お腹いっぱい。
09/04/01 18:36:15
>>385
for文の外でも

=: command not found

と言われてエラーを返されました(´・ω・`)

387:名無しさん@お腹いっぱい。
09/04/01 18:38:48
えっと、この空気的には
output=$i
ってマジレスしちゃダメなんだろなぁ

388:名無しさん@お腹いっぱい。
09/04/01 18:39:51
>>386
他の言語の常識持ち込まずに
ちゃんと構文調べてから書いた方がいいよ。

>>387
別にいいんじゃね。

389:名無しさん@お腹いっぱい。
09/04/01 18:46:55
>>387
それでも

output: command not found

とエラーが返されましたorz・・・

390:名無しさん@お腹いっぱい。
09/04/01 18:49:06
cshユーザーに隙はなかった

391:名無しさん@お腹いっぱい。
09/04/01 18:49:20
>>389
>>387をそのまま書く。
空白入れちゃだめ。

392:名無しさん@お腹いっぱい。
09/04/01 18:59:18
>>391
できました。ありがとうございました(;´∀`)

393:名無しさん@お腹いっぱい。
09/04/01 21:22:43
本日の祭り会場はこちら

【ネット】朝日新聞編集局員(49)、2ちゃんで荒らし行為&差別を助長する書き込み→朝日新聞からの書き込み規制され…★64
スレリンク(newsplus板)


※ソース(3月31日付けasahi.com)
URLリンク(www.asahi.com)

394:名無しさん@お腹いっぱい。
09/04/02 02:25:42
どこかの鯖のシェルスクリプト見るとパスワード書いてあったりするのかwww
なんだかなあ。

395:名無しさん@お腹いっぱい。
09/04/02 08:47:42
findでひっかけたファイル一覧をforで回したいんですけど、引っかけたファイルにスペースが入っている場合、単語単位でforで回ってしまいます。
この場合って、事前にIFSをイジるしか解決策は無いのでしょうか?
findの-print0とかして、forのデリミタをNULLにしたりとかは出来ないのでしょうか?


396:名無しさん@お腹いっぱい。
09/04/02 08:51:34
>>395
find . -exec sh -c 'for arg in "$@"; do echo "$arg"; done' dummy {} +

397:名無しさん@お腹いっぱい。
09/04/02 09:09:17
>>396
ありがとうございます。
出来ました。
ただ何をやっているのか、理解していないと思われる部分があるので質問させて下さい。

dummyは何をやってるのでしょうか?
僕の理解としては、shの引数としてfindの1結果を渡しているんだと思うんですけど、shにとっての第1引数はdummyなので、
dummy ファイル名
が$@に入ってると思います。
ただ、
$ sh -c 'echo "$@"' arg1 arg2
とすると、arg22がechoされるので、dummyが必要なのは現象からわかるのですが、理由がわかりません。

それと、最後の+はどういう意味でしょう。findのmanでは\;で-execは終われと書いてあるように読めるのですが。

以上、すいませんが、解説お願い出来たらお願いします。

398:名無しさん@お腹いっぱい。
09/04/02 10:55:42
どっちもマニュアル嫁だな

sh(1)より:

-c string If the -c option is present, then commands are read from string. If there are
arguments after the string, they are assigned to the positional parameters,
starting with $0.

find(1)より:

-exec command {} +
This variant of the -exec action runs the specified command on the selected files,
but the command line is built by appending each selected file name at the end; the
total number of invocations of the command will be much less than the number of
matched files. The command line is built in much the same way that xargs builds
its command lines. Only one instance of `{}' is allowed within the command. The
command is executed in the starting directory.

399:名無しさん@お腹いっぱい。
09/04/02 11:33:43
forで回したいという要求に合ってない気がするが
空気読んで黙っておくよ

400:名無しさん@お腹いっぱい。
09/04/02 11:47:12
ファイル名にシングルクォートが含まれていないと仮定するなら、

for files in `find . -printf "'%p' "`
do
echo "$files"
done


findに、「シェルで再利用可能なクォートを施した状態でprint」という
機能がない以上、完全な対応は無理。なので、>>396 のように sh -c を -exec する
方法しかない。

401:366
09/04/04 15:56:31 BE:526035762-2BP(0)
お礼遅れてすいません!ありがとうございましたm(_ _)m


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch