- 1 名前:シェルスクリプトライター mailto:sage [2011/12/10(土) 20:06:40.38 ]
- シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。 □お約束 ・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashなので特に注意。 FreeBSDユーザは/bin/shの正体がashなので注意。 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。 src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/ heirloom.sourceforge.net/sh.html ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルスクリプトのことをシェルってゆーな ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも RubyやPerlの方が適した仕事には素直にそちらを使いましょう。 ・知らないコマンドが出てきたらmanを引きましょう。 ・思い通りに動かないときは、まずは sh -x でトレースしましょう。 前スレ シェルスクリプト総合 その18 hibari.2ch.net/test/read.cgi/unix/1308195527/ 次スレは >>970 で。
- 102 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/08(日) 17:51:50.20 ]
- >>100-101
自演乙 おちつけ date +%Y-%m | sed 's/-0//; s/-//'
- 103 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/08(日) 17:58:24.55 ]
- >>100-102
おぉ、もう返答が。 そうか、消したい0の前に何か付け足すことで限定すれば良いんですね。 ありがとうございました。
- 104 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/08(日) 18:03:08.42 ]
- >>99
せっかくbashならdateコマンド以外、内部コマンドだけでもできるよ。 a=($(date +'%Y %m')) echo ${a[0]}${a[1]#0}
- 105 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/08(日) 18:57:49.32 ]
- month=`date +%m`
case $month in 0?) month=${month##0} ;; esac lm=`date +%Y$month` or if you are using GNU date date +%Y%-m
- 106 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/08(日) 19:15:43.51 ]
- bash環境ならGNU dateだろうし、
>>105 最終行の date +%Y%-m が最適解だな。 ところで、>>105 前半のcase文は意味ない。場合分けせずに ${month#0}だけでよい。
- 107 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/08(日) 19:52:34.83 ]
- >>99です。
man dateで>>105さんのやり方がしっかり書いてありました… お恥ずかしい。 皆様ありがとうございます。
- 108 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/08(日) 22:51:02.00 ]
- いいね、これ。
今まで expr で 0 を消してた。
- 109 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/09(月) 08:29:51.48 ]
- exprで0消しならこうか
echo $(date +%Y)$(expr $(date +%m) + 0)
- 110 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/09(月) 08:53:59.96 ]
- あるいは
expr `date +%m` : "0\?\(.\+\)"
- 111 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/09(月) 09:00:41.79 ]
- 先頭に0が付いてると数値演算でハマることがあるよね
$ echo $((08+0)) -bash: 08: value too great for base (error token is "08")
- 112 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/09(月) 09:08:48.76 ]
- >>111
シェルの算術式とかでは頭の0は8進数扱いだからな。 exprなら8進数とはみなさないので、expr 08 + 0 とかやって0を消すのは常識テクニック。
- 113 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/13(金) 10:37:37.37 ]
- 質問させてください。
sed -e "s/ //g" temp.txt ↑ここに/(スラッシュ)を含む文字列を入れたいときはどうしたらいんですか?
- 114 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/13(金) 10:46:55.51 ]
- sed -e "s/ /\//g" temp.txt
- 115 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/13(金) 11:12:47.98 ]
- sed -e "s@ @/@g" temp.txt
>>114のようにするか、区切り文字を"/"から"@"とかの他の文字に変える 純粋なsedの話しなのでスレち ttp://toro.2ch.net/test/read.cgi/unix/1085730992/
- 116 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/19(木) 17:43:20.44 ]
- solarisのfindで、yyyymmddHHMMSS形式のディレクトリ一覧から、任意の日付以降のディレクトリを対象としてtarファイル化処理を実行したいと考えています
中間ファイルを作ってディレクトリ名と日付の比較を行なっての処理は一応出来たのですが、出来ればfind xargsで一発で出来る形にしたいです 中間ファイル無しで上記のような処理は実現できるでしょうか?
- 117 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/19(木) 17:54:34.58 ]
- >>116
yyyymmddHHMMSS形式なら単純な数値と考えて大小比較すればいいね。 比較するのに中間ファイルは要らない。
- 118 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/19(木) 18:05:56.97 ]
- >>117
エスパーカが足りないなw 中間ファイルは条件にマッチしたディレクトリリストのファイルかと tarじゃなくてcpioなら Solaris findの -cpioオプションで一発かな
- 119 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/19(木) 18:35:22.45 ]
- 該当するディレクトリのタイムスタンプがディレクトリ名と同じになっていれば -newer のたぐいが使えるのでは?
- 120 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/19(木) 18:52:00.33 ]
- >>119
-newer のたぐいはまさに中間ファイルが必要ですが
- 121 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/19(木) 18:56:59.65 ]
- 一番古い対象ディレクトリを指定すればOKじゃないかな。
- 122 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/19(木) 19:01:28.69 ]
- 最初の質問の中間ファイルを使う処理をスクリプトのまま書き込んだ方が話が早いと思うが…
どんな内容の中間ファイルをどのような目的で作成しているのか それがわかれば回答する側もエスパーにならなくていいからね
- 123 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/19(木) 19:02:52.93 ]
- 皆さんの書き込みをヒントに自己解決しました。ありがとう。
- 124 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/19(木) 19:04:30.79 ]
- >>123
どうやって?
- 125 名前:名無しさん@お腹いっぱい。 [2012/01/19(木) 23:32:23.93 ]
- このファイルからランダムで1行だけ選択して
/home/my/st/1.txt 1 暑い 2 寒い 3 少し暑い 4 少し寒い 5 すごく暑い 6 すごく寒い /home/my/st/2.txtに書き込ませたいですのですがどう書けば良いでしょうか?
- 126 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/19(木) 23:50:32.46 ]
- cat 1.txt | shuf | head -1 > 2.txt
- 127 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/19(木) 23:57:33.44 ]
- >>126
わお そんなに短く出来るんですね 感謝です!!
- 128 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/20(金) 00:02:25.13 ]
- shuf なんてコマンドあるんだ… ひとつ知識がふえた。ありがとう。
調べたらこんな感じにもできそうだった。 shuf --rndom-source=1.txt -o 2.txt
- 129 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/20(金) 00:34:25.58 ]
- こう使う。
--random-source=/dev/random --random-source=/dev/zeroで試してみて
- 130 名前:名無しさん@お腹いっぱい。 [2012/01/20(金) 01:03:57.15 ]
- Perlの本に、1行ずつ入力を読んで、ランダムな1行を残す方法が載ってたな。
全行シャッフルとかしなくていいのがメリットだとか。 perl -ne '$result = $_ if rand($.)<1; END{print $result}'
- 131 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/20(金) 01:24:54.34 ]
- 負担が軽いのが一番良いしそれが一番難しい
- 132 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/20(金) 06:30:44.02 ]
- >>126
catもパイプも無駄だな。 shuf -n 1 < 1.txt > 2.txt
- 133 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/20(金) 08:44:30.17 ]
- 最初のリダイレクトも不要であろう…
- 134 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/20(金) 11:04:53.93 ]
- shuf って GNU だけだよね?
- 135 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/20(金) 13:37:16.04 ]
- グニュー特選隊
- 136 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/20(金) 13:55:53.73 ]
- >>134
POSIXにはない
- 137 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/20(金) 19:02:11.53 ]
- 比較的最近のcoreutilsから
へどらとかならあるんじゃね?
- 138 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/20(金) 19:09:47.87 ]
- いやいや、5年くらい前からあるよ。
- 139 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/20(金) 19:11:08.12 ]
- 5年が最近なんだろう。
- 140 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/20(金) 19:58:46.80 ]
- バグ出し終わるまで3年は寝かせるよな
- 141 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/20(金) 22:33:57.03 ]
- ファイルからランダムに1行取り出すのにshufを使うのは
大手SIerじゃ5年前から常識だな
- 142 名前:名無しさん@お腹いっぱい。 [2012/01/20(金) 23:18:45.09 ]
- shufはcoreutils 6.0(2006-08-15)からみたいだね。
- 143 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/20(金) 23:39:27.25 ]
- 改行区切りのテキストを、コマンドの引数で渡すために、コンマ区切りにしようとこう書いた
A="`cat list.txt |tr -s \\n , |head -c -1`" でもこれだとnが,に置換される。\\nを'\n'にすればいけたけど、バッククオートの中のエスケープって何回評価されるの?
- 144 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 00:28:29.06 ]
- つ echo "\\n"
\n
- 145 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 01:02:25.99 ]
- ログインするシェルってどうかいたらいいんでしょうか?
ユーザーアカウント名とパスワードを自動で入れてログインしたいのですが
- 146 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 02:12:35.16 ]
- >>143
linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html#lbBA A="$(cat list.txt |tr -s \\n , |head -c -1)"
- 147 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 07:43:37.27 ]
- >>143
とりあえずcatが無駄。 バッククオートの中のバックスラッシュは特殊な意味を持つので、 2回評価されると考えとけばいい。 この例ではバックスラッシュ3回で回避できる。 >>146 $( )使っちゃ駄目よ。
- 148 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 08:02:20.86 ]
- 俺も cat でファイル読む人なんだが、
なぜ cat をわざわざ付けるかと言うと、 自分が作る全てのスクリプトや打ち込むコマンドで ファイルを読む際には必ず cat で読む と統一する事で、ミスる可能性を減らしてるつもり。 客に納品するスクリプトでは仕方なく削るけど。 元々のきっかけは 20 年程前に tar でファイル消してしまったことだった。
- 149 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 08:09:55.16 ]
- 無駄なcatを入れないのは大手SIerじゃ常識だね。
- 150 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 08:51:51.18 ]
- コンピュータ的には無駄だが人間的には無駄ではない。
コメントの様な物だ。
- 151 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 08:55:23.20 ]
- cat file | コマンド
の順に書きたいというだけの理由なら、 < file コマンド と書けば良い。
- 152 名前:143 mailto:sage [2012/01/21(土) 09:25:54.14 ]
- >>146
凄く参考になった。ありがとう > バッククォートを使う古い形式の置換を用いたとき、バックスラッシュは文字通りの意味を保ちます > が、 $, `, \ の前にある場合は例外となります。バックスラッシュが前置されていないバッククォートが > あると、そこでコマンド置換は閉じられます。 $(command) という形式を用いたときは、括弧の間にある > 全ての文字がコマンドとなります。特別扱いされる文字はありません。 `cmd`と$(cmd)の2つの形式で意味(処理?)が違うなんて知らなかった > コマンド置換は入れ子にできます。バッククォート形式の時に入れ子を行うには、 > 内側のバッククォートをバックスラッシュでエスケープします。 入れ子にするときは2つの形式を組み合わせて書いてたから、これも気が付かなかった 特殊扱いの文字が$(cmd)形式ではないなら、cmdの中に)がある場合\でエスケープはできないってことか >>147 評価回数について、ありがとう。最小3つ並べる必要があるのか cat使っているのは、前処理があってパイプを使っているという意思表示 ときどきシーク可能か否かで挙動が変わるプログラムもありますし
- 153 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 10:01:25.74 ]
- >>147
> $( )使っちゃ駄目よ。 爺さんや、Solarisでも/bin/shはkshになりましたよ。 というわけでもういいんじゃないか。テンプレもそろそろ修正どき。
- 154 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 10:17:31.18 ]
- >>151
正直、その書き方は知らなかった。
- 155 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 10:26:19.10 ]
- >>148
同じ様な経験から自分と似たような対処している全然知らない人の存在を知ると、何か和むなぁ
- 156 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 10:28:50.43 ]
- $( )を使わないのは大手SIerじゃ常識だね。
- 157 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 11:57:08.26 ]
- >>148
なんかずれてる気がする
- 158 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 12:16:06.97 ]
- >>148
tar xvf と tar cvf を間違えたって話か? ふつーあらかじめ chmod -w hoge.tar やっておくから消すことはありえない。
- 159 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 12:33:47.90 ]
- sudo tar cvf 〜 なんてしちゃったり
- 160 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 13:25:25.15 ]
- ftpmailで取得してた20年前じゃあるまいし、tarなんか消しちゃっても全然問題ないだろ。
- 161 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 13:29:30.84 ]
- tar cvf aaa.tar bbb ccc
とやろうとして tar cvf bbb ccc とかやって、bbbを消しちゃったってことかな
- 162 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 13:32:21.94 ]
- あぁ、もともとのきっかけは20年前か… ftpmailあり得るな。
- 163 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 14:11:25.85 ]
- >>161
>>146 では「ファイルを読む際には必ずcatで読む」て言ってるから、 tar xvf の時の話かと。
- 164 名前:148 mailto:sage [2012/01/21(土) 23:40:04.95 ]
- >>158
> tar xvf と tar cvf を間違えたって話か? それそれ。
- 165 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 00:51:01.40 ]
- 俺も先頭にcat付ける派。
cat foo | cmd1 で、cmd1の前に前処理やりたくなった時、 cat foo | cmd0 | cmd1 と書き換え簡単。 cmd1 fooをcmd0 foo | cmd1にするのは語順置き換えがある。 transpose-wordするのは空白入り"文字列やオプション指定があるとちょっと面倒。 ファイル名をひとつしか指定できないバカコマンドで、 2つ指定したくなった時にイラっとくるから、などの理由。
- 166 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 01:25:14.86 ]
- 俺はcatつけないな。後段のコマンドにもよるけど、
ファイルがないなどのエラーを捕捉し損ねる可能性があるから。
- 167 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 06:46:04.29 ]
- むかし、cat foo | sed をここで書いて叩かれた思い出。
- 168 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 08:04:14.62 ]
- >>165 は >>151 読んでないだろw
cat foo | cmd1 ではなく、 < foo cmd1 とする。(いつもこう書く癖を付けておく) で、cmd1の前に前処理やりたくなった時、 < foo cmd1 | cmd2 と書き換え簡単。 以上で、catを無駄に使う理由がなくなる。
- 169 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 09:05:11.75 ]
- scshっていうシェル思い出しわ
(| (< foo cmd1) cmd2) とかって書くやつ
- 170 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 10:15:08.87 ]
- >>168
流れが一方向ではないので理解しづらい。 そもそも<禁止ルールがある場合もある。
- 171 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 10:19:18.34 ]
- > <禁止ルール
俺ルールでは禁止って後だしで言われてもなあ。 w
- 172 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 10:30:20.87 ]
- >>170
良く見ろ。流れは一方向だぞ。 流れを一方向にするために、 com1 < file | com2 を < file com1 | com2 と並べ変えたんだが。>>170 は良く読んでなさそうだなw
- 173 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 11:00:43.73 ]
- 知識の浅い上司に、直されることはある。
初心者でも読めるように cat から始めろ。 実績がないから cat から始めろ。 俺流を通す無能な上司を説得する方法も教えろください。
- 174 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 11:05:03.14 ]
- >>168
> で、cmd1の前に前処理やりたくなった時、 > < foo cmd1 | cmd2 逆じゃね?
- 175 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 11:16:14.22 ]
- 後付けで無能な上司という制約条件だされてもなあ。そんなとこ辞めれば? w
- 176 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 11:16:49.44 ]
- >>174
で、cmd1の前に前処理やりたくなった時、 < foo cmd0 | cmd1 かな
- 177 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 11:22:49.70 ]
- いや、後付けじゃなくて便乗なんだけどね…
- 178 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 11:30:36.38 ]
- catなんてあんたのような無能かつ無用な上司。そんなプロセスは必要ないでしょ。
- 179 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 11:38:12.78 ]
- kill -9 >>178 > /dev/null 2>&1
- 180 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 11:43:57.77 ]
- 何でもいいけど
引用レスの最初に入力リダイレクト書くと顔文字みたい > <
- 181 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 12:11:08.98 ]
- >>179
2>&1とか使うくらいならcshでやれよ頭固いなあ
- 182 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 12:15:52.47 ]
- >>181
だって、無能上司の部下だもの。
- 183 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 12:19:51.88 ]
- cat >>181 | tee -a 2ch.net 2> /dev/null
- 184 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 12:29:22.98 ]
- じゃあ俺はcatじゃなくてdog使うわ
- 185 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 13:05:48.18 ]
- cshを使わないのは大手SIerじゃ常識だね。
- 186 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 13:16:17.54 ]
- >>168
< foo cmd1は使えない。 !<でも !cmd1 でもhistoryを呼び出せない。
- 187 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 13:21:03.72 ]
- >>186
シェルスクリプトでhistoryを使う馬鹿?
- 188 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 13:41:56.10 ]
- >>186
全力で己の無能を告白するなよ。ドMの新しいプレーか? www !?cmd1 で呼び出せるだろ。
- 189 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 14:22:29.46 ]
- cat使うと複数でも処理対象がハッキリするから好きな書き方ではある。冗長だけどね
リダイレクトじゃ複数は無理だし、多く引数を取るコマンド、特に入出力のファイル名を どちらも引数に取れるコマンドだと、入力だけ区別して分けられる
- 190 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 14:45:03.84 ]
- テキストファイルだけ扱うならいいけどバイナリファイルだとcat通すと0x1dが消えたりしてファイル壊すから危険。
- 191 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 14:47:00.85 ]
- 読み取る側から見た場合、リダイレクトならシーク可能だけど
パイプはそうではないという違いもあるよね つまりcatが単に冗長で資源の無駄、というだけでなく 単純にcatではダメなケース(あるいは非常に非効率になるケース)が 厳然としてあるわけで、>>173の上司にはその点を訴えてみたらどうだろうか stdout/stderrを何かに保存する目的でいずれにせよリダイレクトは使うだろうし パイプのほうがリダイレクトより「初心者でも読める」というのは意味不明だ なんかほんの少しでも合理的な理由があるのだろうか?
- 192 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 14:51:57.61 ]
- >>189
バカな習慣を必死に言い訳すんなよ。羞恥プレー続行中か? w 複数ファイルを引数に取るのはどうすんだよ。 for f in $files ; cat $f |file -;done こうか? スゲーぜ。 www
- 193 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 15:31:48.18 ]
- >>192
fileは普通標準入力から読み込ませることはしないだろ?シェルスクリプトで使うこと前提だぞ、スレ的に
- 194 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 15:36:47.44 ]
- >>190
何それ? 分割したバイナリを合体させるのに普通にcat使えるでしょ catってfile結合コマンドだよ
- 195 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 16:05:46.12 ]
- >>191
ありがとう。 機会ができたら、訴えてみる。 「初心者でも」っていうのは、ちょっとニュアンスが伝えにくいんだけど…気にしないで大丈夫です。 展開の順序とか考えず、コマンドを並べるならなんでもかんでもパイプを通せばいいじゃんって 新人とかへ教えるのが楽だから、そういう(ローカルな)文化になってるのかも。
- 196 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 16:13:11.56 ]
- >>193
「ヒストリー使えないからダメ」とか言い出したのはやっぱり羞恥プレーか? まあ、それは置いとくとして、「入力ファイルを区別できるからからcatして パイプから流し込む」と言い出したバカをからかってるだけだよ。 入力ファイルは引数から渡した方が、 1 名前を渡せる。 2 シークも可能。 と、明らかに有利。 catはその名の通りファイルを結合する場合に使用する。 恥さらしな習慣の見苦しい言い訳まだ続ける?
- 197 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 16:59:14.69 ]
- 世の中には、cat = catalog の略といわれて、からかわれてるのに気付かず信じるような
僕みたいなのもいるのですよ。 concatenate なんて…
- 198 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 17:13:08.18 ]
- >>191
リダイレクトってシーク可能だったのか、知らなかった。 でもシークできるかできないかで挙動を変えるのはプログラム側だよね? プログラムの実装でわざわざstdinがシークできるかどうかチェックするロジックって普通実装してある? シーク前提のプログラムはそもそも標準入力から読み込もうとしないんじゃないかな。
- 199 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 17:37:41.83 ]
- 見苦しい言い訳をまだ続けるのか。
> プログラムの実装でわざわざstdinがシークできるかどうかチェックするロジックって普通実装してある? お前のようなボンクラは知らないだろうが、必要ならばしている。
- 200 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 17:52:16.93 ]
- >>198
fstat()で簡単に判断できるから、まともなプログラムならシーク可能かどうかは 「標準入力かどうか」ではなく、stat情報で判断する ロジック的に1パス、シークエンシャルアクセスで行ける場合でも、 wavみたいなある程度でかいバイナリストリームを処理するソフトウエアでは 不要なチャンクをシークで飛ばせるかread()が必要かでは大違いなので 特にマルチメディア系ではシークが使える場合には使うのが普通 (そうしたプログラムがパイプで標準入力を利用可能なのも普通)
- 201 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 18:45:46.67 ]
- >>198
ざっとbinutils、grep、awk、sedのソース漁ってみてが、無いな
- 202 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 18:50:17.20 ]
- >>201
ボンクラがメクラ撃ちしたって当たらないって事の証明だな。 オレは一発でtailを見つけたが。w lessもおそらくやってる。
|

|