シェルスクリプト総合 その21
at UNIX
[前50を表示]
150:名無しさん@お腹いっぱい。
13/01/24 08:38:20.39
ようするに >>141 は . と .. がリンク数に含まれることを知らないってことかな
151:名無しさん@お腹いっぱい。
13/01/24 08:43:24.58
>>150
すでに>>143が解説済み。
152:名無しさん@お腹いっぱい。
13/01/24 09:15:47.01
空ディレクトリが存在しないのであれば
rmdirはどのディレクトリも削除できないのでは?
153:名無しさん@お腹いっぱい。
13/01/24 09:35:00.86
こまけぇことは気にしないで消せばいいんだよ
154:名無しさん@お腹いっぱい。
13/01/24 11:20:22.52
>>152
空ディレクトリは.と..以外のファイル/ディレクトリが無いディレクトリのこと
155:名無しさん@お腹いっぱい。
13/01/24 18:41:29.19
/a.appを起動
プロセスを終了
を5秒ごとに繰り返すコマンド書いてくださいな
156:名無しさん@お腹いっぱい。
13/01/24 18:47:02.12
なんでそんな傲慢なの?
157:名無しさん@お腹いっぱい。
13/01/24 18:51:36.35
そうそう、アプリを起動してプロセスを終了を、
5秒ごとに繰り返したりしたいこと多いよね、共感します。
158:名無しさん@お腹いっぱい。
13/01/24 21:04:28.31
>>155
プロセスを終了 って、どのプロセスでもいい?
159:名無しさん@お腹いっぱい。
13/01/24 21:33:59.04
>>155
while sleep 5;do pkill a.app;/a.app &;done
ほんとはpid拾うべきか。$?だっけ。
160:名無しさん@お腹いっぱい。
13/01/25 01:43:15.60
$! な
161:名無しさん@お腹いっぱい。
13/01/25 11:02:15.89
.appって拡張子はMac OS Xのbundleか?
だとするとopen -a /a.appだろうけど、まあapplescriptで書いた方がいいよ。
ジェントルに終了させられるし。
162:名無しさん@お腹いっぱい。
13/01/25 11:31:59.01
applescriptって#がコメントにならないから
#!/usr/bin/osascriptって書けないんだよね…。
163:名無しさん@お腹いっぱい。
13/01/25 11:46:54.65
ファイルの一行目だけ特殊扱いしてくれればいいんだけどな。
そういうLisp系のインタープリタある。(そもそもLisp系は行頭の#がちと特殊だが)
164:名無しさん@お腹いっぱい。
13/01/25 13:38:52.29
>>162
2行目以降を使うスクリプトを書いてそれをシェバングにしたら?
165:名無しさん@お腹いっぱい。
13/01/25 14:09:28.74
>>164
残念。
シェバングに指定できるのはバイナリだけ。(スクリプトじゃ駄目)
166:名無しさん@お腹いっぱい。
13/01/25 16:53:20.52
>>165
じゃあperlかなんかで1行に凝縮させればおk
167:名無しさん@お腹いっぱい。
13/01/25 16:57:50.64
あれ?バイナリじゃなくても動くぞ?
うちの壊れたか?
168:名無しさん@お腹いっぱい。
13/01/25 17:47:21.06
shellが実行する場合もある。
169:名無しさん@お腹いっぱい。
13/01/25 17:48:02.97
いずれにせよexecve(2)の中でやることだし、
最近は自分で処理するシェルもいるし。
170:名無しさん@お腹いっぱい。
13/01/25 21:06:05.27
osascript は Leopard 以降なら sh-bang を理解するお。
171:名無しさん@お腹いっぱい。
13/01/25 22:24:03.73
うろ覚えだけどbashの挙動は
とりあえずexec*してみる -> 駄目だったら/bin/bashで実行してみる
の2段構えだったような。
172:名無しさん@お腹いっぱい。
13/01/26 13:02:07.76
FreeBSDだと #!インタプリタ にバイナリしか指定できないが、
Linuxだとインタプリタがスクリプトでも動くようだ。
173:名無しさん@お腹いっぱい。
13/01/26 13:06:41.79
BSDはダメだな
ずいぶんと中途半端な意識だな
174:名無しさん@お腹いっぱい。
13/01/26 17:08:04.37
>>172
だから、それはLinuxの機能じゃなくてbashの機能でしょ。
175:名無しさん@お腹いっぱい。
13/01/26 17:11:06.38
_人人人人人人人_
> bashの機能 <
 ̄Y^Y^Y^Y^Y^Y ̄
176:名無しさん@お腹いっぱい。
13/01/26 17:39:24.66
>>174
bashの機能じゃなくてカーネル(システムコール)のexecve(2)の機能なんだけど。
177:名無しさん@お腹いっぱい。
13/01/26 19:52:37.75
URLリンク(git.kernel.org)
178:名無しさん@お腹いっぱい。
13/01/26 23:23:34.63
BSD系って結構厳密みたいだね。
#!/usr/bin/env PATH=/bin:/usr/bin:/usr/local/bin sh
のどこか適当なshを使ってという方法もできないような。
179:名無しさん@お腹いっぱい。
13/01/26 23:31:57.82
それって厳密か?
180:名無しさん@お腹いっぱい。
13/01/27 03:11:09.66
何を厳密といってるのか知らないけど、#!行ではオプションは一つしか指定できない。
↓これはダメ
#!/usr/bin/env PATH=/bin:/usr/bin:/usr/local/bin sh
181:名無しさん@お腹いっぱい。
13/01/27 08:31:23.75
>>180
だから、それはFreeBSDの仕様じゃなくてashの仕様でしょ。
182:名無しさん@お腹いっぱい。
13/01/27 08:38:44.48
_人人人人人人人_
> ashの仕様 <
 ̄Y^Y^Y^Y^Y^Y ̄
183:名無しさん@お腹いっぱい。
13/01/27 09:16:38.06
>>176
URLリンク(linux.die.net)
The interpreter must be a valid pathname for an executable which is not itself a script.
って書いてあるけど。
>>177
URLリンク(www.tamacom.com) だと
26 if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') || (bprm->sh_bang))
27 return -ENOEXEC;
となってるので、仕様変えたのかな。
これ、
# cat /bin/aho
#!/bin/baka
$ cat /bin/baka
#!/bin/aho
とループしてたらどうなる?
184:名無しさん@お腹いっぱい。
13/01/27 09:31:47.72
>>183
仕様変えた。Linuxでも古いカーネルだと#!/スクリプトは不可。
#!スクリプトがループしてた場合は単にexecve(2)がエラーになるだけ。
一応ループ判定はしてるみたい。
185:名無しさん@お腹いっぱい。
13/01/27 09:43:22.30
>>183
スクリプトのネスティングが4回程度でエラーになるようになってるから、
ループしてたらそれでエラーになる。無限ループでハマることはない。
186:名無しさん@お腹いっぱい。
13/01/27 10:16:14.90
なるほど、
>>177
25 if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') ||
26 (bprm->recursion_depth > BINPRM_MAX_RECURSION))
BINPRM_MAX_RECURSIONまでは再帰するのか。
>>183の例では/bin/aho, /bin/bakaの実行を何回も試みてBINPRM_MAX_RECURSIONに
達してやっとエラーか。 ダサッ
187:名無しさん@お腹いっぱい。
13/01/27 10:42:07.89
シンボリックリンクのループ検出と一緒だろ。OSによらず。
2つだけでループしててもMAXに達するまでずっとたどってようやくエラー。
188:名無しさん@お腹いっぱい。
13/01/27 12:47:54.49
そういえばそうだな。でも自己参照くらいはその場でチェックしてもいいだろ。
$ cat /bin/aho
#!/bin/aho
189:名無しさん@お腹いっぱい。
13/01/27 12:52:21.55
その場でチェック()
190:名無しさん@お腹いっぱい。
13/01/27 13:55:52.24
Patches Welcome
191:名無しさん@お腹いっぱい。
13/01/27 14:29:29.40
そもそも自己参照していない正常なスクリプトの方が圧倒的に多いんだから、
自己参照をチェックするとそのオーバーヘッドが、全ての正常なスクリプトにも
負担させられることになって、実行速度がかえって遅くなるかと。
192:名無しさん@お腹いっぱい。
13/01/27 16:42:35.29
ファイルからの読み込み行ってるんだから、スクリプトファイル名の比較の
負荷なんてゴミでしょ。
193:名無しさん@お腹いっぱい。
13/01/27 17:04:30.10
>>192 のプログラマのセンスのなさはわかった。
194:名無しさん@お腹いっぱい。
13/01/27 17:42:33.16
>>193
具体的に解説ヨロシク
195:名無しさん@お腹いっぱい。
13/01/27 17:53:16.99
まずコードを書け、話はそれからだ
196:名無しさん@お腹いっぱい。
13/01/27 18:21:24.09
>>195
だよな
>>193には具体的なコードを示す義務がある
197:名無しさん@お腹いっぱい。
13/01/27 18:25:49.84
>>196
何を言ってるんだ?コードの話をしているお前ら全員だよ
198:名無しさん@お腹いっぱい。
13/01/27 19:34:09.72
>>187
> シンボリックリンクのループ検出と一緒だろ。OSによらず。
シンボリックリンクのループ検出なんてある?
どういった場合に検出する?
199:名無しさん@お腹いっぱい。
13/01/27 19:56:14.74
>>198
$ ln -s hoge /tmp/hoge
$ cat /tmp/hoge
cat: /tmp/hoge: Too many levels of symbolic links
200:名無しさん@お腹いっぱい。
13/02/12 18:33:08.66
URLリンク(d.hatena.ne.jp)
some-command 3>&1 >/dev/null 2>&3 3>&- | less
1番の値が最終的にどこいったのがかわからんのです・・・
1→3→2とコピーされて標準エラー出力になるんじゃないの?
201:名無しさん@お腹いっぱい。
13/02/12 18:46:22.72
>>200
1は/dev/nullだよ。
202:名無しさん@お腹いっぱい。
13/02/12 18:53:12.63
>>200
1は3経由で最終的に2にコピーされて、その状態でsome-command が実行されてる、
で合ってるよ。
その「2にコピーされたもの」はパイプの入力だから、
結果的にsome-commandの標準エラー出力がパイプにつながる。
some-commandの標準出力は >>201 のとおり /dev/nullに捨てられてる。
203:名無しさん@お腹いっぱい。
13/02/12 19:05:35.88
リダイレクトは左から順番に解釈していけば良いよ。
(1) 3は1(標準出力)に向けられる。
(2) 1は/dev/nullに向けられる。
(3) 2は3(標準出力)に向けられる。
(4) 3は閉じられる。
結果として
1は/dev/nullに2は標準出力に向いてる。
204:名無しさん@お腹いっぱい。
13/02/12 20:55:57.35
再度質問です
shの機能で >>200 みたいに だーってリダイレクトが出来るじゃないですか
その文法から「1」が最終的にどこ行ったのか わーって追跡したいんです
出来ますの?勿論ググりましたが、当方馬鹿なのでわかりません
サルでも分かるような回答を強く期待します
僕はこういう小バカにしたような書き方しか出来ませんが、凄く切実に知りたいです
さぁどうぞ↓
205:200
13/02/12 21:09:43.68
うごごごご
206:名無しさん@お腹いっぱい。
13/02/12 21:24:31.15
>>204
> aその文法から「1」が最終的にどこ行ったのか わーって追跡したいんです
ktrace とか truss とか strace ってのはダメ?
207:名無しさん@お腹いっぱい。
13/02/14 11:04:26.66
シェル変数にコマンドを文字列として設定しておいて、それを実行したい。
CMD="printf '%x %x\n'" #これはダメ
$CMD 13 32
を実行して
printf '%x %x\n' 13 32
と同じ出力を得たい。
$CMD 13 32の行は変更不可。
CMD="printf '%x %x\n'"ではダメでした。
CMDにどのような文字列を与えると実現できるでしょうか?
bashの拡張機能を使ってもよいですが、なるべく使わない方向で。
208:名無しさん@お腹いっぱい。
13/02/14 11:09:32.45
お題が不正確でした
> $CMD 13 32の行は変更不可。
$CMD 13 32
を含むシェルスクリプトがある。環境変数としてCMDを与えて
printf '%x %x\n' 13 32
と同じ出力を得たい。
CMDに
#!/bin/sh
printf '%x %x\n' "$@"
というスクリプトのパスを与える方法は思いつきましたが、スクリプトファイルを作成しないで実現したい。
209:名無しさん@お腹いっぱい。
13/02/14 11:44:48.59
>>208
CMD='printf %x\040%x\n'
バックスラッシュが化けるので全角にしたので半角に直してね
210:名無しさん@お腹いっぱい。
13/02/14 13:05:11.46
evalって知ってる?便利だよ
211:名無しさん@お腹いっぱい。
13/02/14 13:12:07.63
>>210
> $CMD 13 32の行は変更不可。
evalも使用不可
212:名無しさん@お腹いっぱい。
13/02/14 14:38:40.47
>>211
CMDの中にeval入れれば行けるだろ
CMD="eval print ..以下略
213:名無しさん@お腹いっぱい。
13/02/16 14:38:00.54
>>212
それでOKでした。
214:名無しさん@お腹いっぱい。
13/02/16 21:58:07.02
>>211
>>211
>>211
215:名無しさん@お腹いっぱい。
13/02/17 00:35:16.20
ももクロはズリネタ探しをしている人には理解出来ないよ
216:名無しさん@お腹いっぱい。
13/02/17 00:51:10.81
awkのprintで
1, print $2
2, print \$2
3. print\ \$2
1、2は2列目て事だと思うけど3てどうなるの?
217:215
13/02/17 01:31:05.17
あれ・・盛大に誤爆ってたwごめん
218:名無しさん@お腹いっぱい。
13/02/17 02:55:22.76
>>214
呼び出すところが変わってないから良いんじゃないの?
219:名無しさん@お腹いっぱい。
13/02/20 21:18:41.67
2chの画像スレ開いて、Ctrl+aでコピーしたのをdl.txtにコピーしておいて
そのカレントフォルダでこれ実行すると、びっくりするほどユートピア
grep -E "(^http|^ttp)" dl.txt |sed -e "s/http/ttp/g; s/ttp/http/g"| wget -A jpg,png,gif -N -i -
220:名無しさん@お腹いっぱい。
13/02/20 21:43:00.53
昔そういう事やってたけど
グロ画像が紛れ込んじゃうからやめたよ
安心してシコシコできない
221:219
13/02/20 21:54:17.39
>>220
それなんだよ...URLのブラックリストとか出来ないかな?まぁ出来ても遅くなりそうだけど
222:名無しさん@お腹いっぱい。
13/02/20 22:04:29.90
ブラックリスト作っておいてgrep -vで除外するくらいかな?
いちいちグロ画像調べてNG登録するのが嫌でね…
223:名無しさん@お腹いっぱい。
13/02/20 22:48:10.03
grepしてからsedですか、そうですか
224:名無しさん@お腹いっぱい。
13/02/21 00:53:50.25
>>221
専ブラ使えよ。
グロってレスがついてたら、モザイクかけてくれたり。
225:名無しさん@お腹いっぱい。
13/02/21 01:03:43.88
>>219
スレとってくんのもwgetでいいだろ。なぜに手動。
226:名無しさん@お腹いっぱい。
13/02/21 10:19:46.09
>>224
>グロってレスがついてたら、モザイク
それ便利そうだな! どこの専ブラ?
うちはかちゅ〜しゃ使ってるけど
227:名無しさん@お腹いっぱい。
13/02/21 13:17:14.46
>>220
いやいや、落としたら、シコシコする前に、まず賢者モードで分類とか整理しろよ。
228:名無しさん@お腹いっぱい。
13/02/21 15:56:58.86
>>227
モード切替どうやってするつもりだよ
229:名無しさん@お腹いっぱい。
13/02/21 21:47:15.77
>>226
2chmate
230:名無しさん@お腹いっぱい。
13/02/22 12:12:03.87
シェルスクリプト内でtarアーカイブ化するとき、アーカイブ名に変数を指定したいのですが、
エラーが出てtarが生成されません。なにが間違っているか教えてください。
strArch="~/Desktop/a.tar"
/usr/bin/tar cf ${strArch} 1.jpg 2.jpg 3.jpg
と書くと
/usr/bin/tar: ~/Desktop/a.tar: open 不能: No such file or directory
/usr/bin/tar: Error is not recoverable: exiting now
というエラーが出ます。
一方、
/usr/bin/tar cf ~/Desktop/a.tar 1.jpg 2.jpg 3.jpg
と書くと正常にa.tarが生成されます。
231:230
13/02/22 12:13:52.84
環境はcygwinで、シェルはbashです。
232:名無しさん@お腹いっぱい。
13/02/22 12:40:05.30
>>230
変数の中のチルダは展開されない。
$HOME/Desktop/a.tar
を使え。
233:名無しさん@お腹いっぱい。
13/02/22 13:01:39.80
>>232
できました!
ありがとうございました。
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4672日前に更新/53 KB
担当:undef