1名無しさん@お腹いっぱい。2018/08/02(木) 05:22:16.82
2名無しさん@お腹いっぱい。2018/08/02(木) 07:30:57.65
3名無しさん@お腹いっぱい。2018/08/02(木) 08:22:54.47
FAQ
Q. 秘密結社シェルショッカーってなんですか?
A. しらん。どっかの変態団体やろ。近寄らんほうが良い。
Q. USP友の会ってなんですか?
A. しらん。どっかの変態団体やろ。近寄らんほうが良い。
Q. シェル芸ってなんですか?
A. しらん。ヲタ芸みたいなもんやろ。恥ずべきものや。
Q. ユニケージ開発手法ってなんですか?
A. しらん。所でアプリの開発には普通のプログラム言語使ったほうが良いぞ
4名無しさん@お腹いっぱい。2018/08/02(木) 08:24:01.24
シェルスクリプトの総合スレです。
初心者、学生、アマチュア、プロ、シェルの種類や OS を問いません。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずはテンプレートをご覧下さい。
★A. お約束
1. 特記なき場合は #!/bin/sh がデフォルトです。この場合可搬性に注意し、
Traditional Bourne Shell もしくは、POSIX 相当のスクリプトでお願いします。
bash / zsh / ksh / ash / dash や OS 等に依存する場合は、明示しましょう。
良く分からない方は、使用している OS を書いておけば OK です。是非ご参加下さい。
2. 質問する前に、まず自分で調べましょう。ただし、
「聞くは一時の恥、聞かぬは一生の恥」です。積極的に参加しましょう。
3. 相手を侮辱する発言、失礼な発言は差し控え、知的な議論を楽しみましょう。
4. 他者には様々な環境や事情、目的が有る事に留意し、無下に扱う様な発言は
控えましょう。
★B. お約束の補足
1. macOS では、/bin/sh の実体は bash です。また、一般的に BSD 系 や
GNU/Linux の方は、/bin/sh がシンボリックリンクですので、注意して下さい。
ls (ハイフン)l /bin/sh や readlink -e /bin/sh で確かめて下さい。
2. 可搬性については、下記 F.1 を参照して下さい。
3. POSIX については、man 7 standards や下記 F.2 ( の特に Shell & Utilities )
を参照して下さい。
4. Traditional Bourne Shell とは、UNIX Version 7 から SVR4.2 の /bin/sh を元に
小さなの改変を加え主に商用 UNIX で残されているものです。( 下記 F.3 参照 )
5. Traditional Bourne Shell で入手しやすい sh は、後期 SVR4.0 から派生し、
SunOS 5 / OpenSolaris を経た、Heirloom Bourne Shell です。
SVR4 / SVID3 相当です。同様の Unix utilities も扱っています。
( 下記 F.3 参照 )
5名無しさん@お腹いっぱい。2018/08/02(木) 08:24:52.02
★C. 初心者へのアドバイス
1. シェルスクリプトのことをシェルってゆーな
2. 知らないコマンドが出てきたら man コマンドで調べましょう。
3. UNIX には、シェルスクリプトに便利な小さなコマンドが色々あります。
apropos ないしは man -k でそれらしい単語による簡単な検索もできます。
4. シェルの構文や内部コマンドは man sh で。英語は LANG=C man shで。
5. 思い通りに動かないときは、まずは #!/bin/sh -x でトレースしましょう。
6. 適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
awk / perl / javascript / ruby / python 等、他の (スクリプト) 言語の方が
適した処理にはそちらを使いましょう。
7. シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題は正規表現スレへ
8. csh / tcsh のシェルスクリプトは推奨されません。理由は下記を参照
http://www.speech-lab.org/~hiroki/csh-whynot.euc
9. cat file|すんなハゲ
a. 詳細は "Useless Use of Cat" UUOC で検索して下さい
b. 有用な場合も有ります Useful use of cat(1) 英文
http://www.in-ulm.de/~mascheck/various/uuoc/
★D. シェルスクリプトでよく使うコマンド
1. 制御・条件判定系: [, test, expr, true, false, yes, getopts
2. テキスト処理系: cat, awk, sed, tr, sort, uniq, grep, wc, head, tail, cut,
paste, comm, join
3. ファイル検索系: find ( スペースなどを含むファイル名を正しく処理するため、
find は -exec command {} + を推奨。
他に -print0、xargs は -0 オプションという方法もあるが Solaris 非対応 )
4. ディレクトリ系: basename, dirname
5. 出力系: echo, printf
6. 対話コマンド制御系: expect
7. http / ftp の処理自動化: wget, curl 6名無しさん@お腹いっぱい。2018/08/02(木) 08:25:30.27
7名無しさん@お腹いっぱい。2018/08/02(木) 08:26:16.74
8名無しさん@お腹いっぱい。2018/08/02(木) 08:26:56.94
9名無しさん@お腹いっぱい。2018/08/02(木) 08:40:37.63
10名無しさん@お腹いっぱい。2018/08/02(木) 08:59:28.57
11名無しさん@お腹いっぱい。2018/08/02(木) 09:07:59.90
移りたい奴はさっさと移れよ
もうここ来んな
12名無しさん@お腹いっぱい。2018/08/02(木) 09:21:20.82
移りたくない理由って、前スレで自演荒らししてたからってのしか思いつかない。
このスレを使いたい人間ってのが荒らしだとしたら、このスレを捨てるのが適切では?
13名無しさん@お腹いっぱい。2018/08/02(木) 10:08:56.08
お前が今やってることが荒らしだろ
さっさと移れよ
14名無しさん@お腹いっぱい。2018/08/02(木) 10:25:08.21
>>13
移りたくないのであれば、前スレで反論する機会があったのに、
一言も反論せずにいきなりこのスレを建てたんだから、
どう考えてもあなたがスレ荒らしでしょう。 15名無しさん@お腹いっぱい。2018/08/02(木) 10:26:56.73
16名無しさん@お腹いっぱい。2018/08/02(木) 11:50:13.77
移りたかった奴らがいつまでも見てんなよ
ここを荒らすな
17名無しさん@お腹いっぱい。2018/08/02(木) 11:51:21.90
ここのことは忘れて移った先で楽しく過ごしてください
もう構わないでね
18名無しさん@お腹いっぱい。2018/08/02(木) 12:36:09.60
>>17
荒らしスレであることを知らずに迷いこむといけませんから、
知らずに書き込んだ可能性がある場合には、重複スレである旨の
注意書きを今後も投稿するつもりです。
荒らしスレであることを承知の上で書き込んでいるケースについては、
私は今後このスレに書きこみません。
他の人がどうするかは私には分かりませんが。 19名無しさん@お腹いっぱい。2018/08/02(木) 13:00:44.80
向こうのスレで、こっちにしつこく誘導しようとしてるなら非難されて仕方ないけど、そんなことしてる奴いないんだろ?
見てないから知らんが
もうここは構ってくれなくていいって
余計なお世話だわ
どんだけ暇人だよ
20名無しさん@お腹いっぱい。2018/08/05(日) 08:04:43.32
fishをログインシェルとして使ってます
zshの場合bindkey "\e[A" history-beginning-search-backward-end
で数文字入力して上矢印キーを押すと直近の履歴から保管されますが
fishでこれをしたい場合どうすればいいのでしょうか?
fishだとデフォルトで右矢印キーがこの動作になるようですが
これを上矢印キーにしたいところです。
21名無しさん@お腹いっぱい。2018/08/05(日) 08:21:50.23
~ > bind|grep search-back
bind \e\eOA history-token-search-backward
bind \e\e\[A history-token-search-backward
bind \eO3A history-token-search-backward
bind \e\[3A history-token-search-backward
bind \e\[1\;3A history-token-search-backward
bind \e\[1\;9A history-token-search-backward
bind \e. history-token-search-backward
bind \eo history-token-search-backward
22名無しさん@お腹いっぱい。2018/08/27(月) 12:16:09.32
wgetを使ってシェルスクリプトでダウンロードツールを作ったんだけど
ナロー回線だから出来るだけ無駄を省きたくて
-cオプションで既存ダウンロード分に追記する形にしてる
でも当然ならがコマンドが2重に発行されたらぐちゃぐちゃになるから
psコマンドでwgetを2重発行しないようにしてるけどちょっと不安
実際一部の文字がpsコマンドで「?」表示されてgrepに掛からなかったことがあり
ファイルが壊れたことがあった
ぶっちゃけダウンロードしてるのはニコニコの動画であり
(動画なんで視聴しないと壊れてるのかわからず厄介)
ID_タイトル.mp4とかの形式で保存してるんだけど
問題はマルチバイト文字のタイトルだから
「grep "${id}.*${extention}"」として回避
実際はもうちょっとコマンドの詳細まで見てるけど
こんな場合のベストってダウンロード先のファイル名に
プロセスID(wgetを実行するシェルスクリプトのプロセスID)を含めるようにして
状況に応じてファイル名を変えながらwgetするくらいしかないのかな?
既存ダウンロード分のmvに成功したらwgetするとかで
ファイルをロックする相当の処理を実現するイメージなんだけど
ちなみにナローじゃない回線を使うことがあったり
ダウンロード中に止まることがあるため
複数の動画を同時並行でダウンロードするつくりにしているため
この問題はぜひとも回避したいです
23名無しさん@お腹いっぱい。2018/08/27(月) 12:48:42.73
>>22
>複数の動画を同時並行でダウンロードするつくり
なんでlockファイルで二重起動を防止しないのだろうと思ったら、
同時並列でwgetを実行したいけど、
1つの動画については多重実行されないようにしたい、ということか。
ニコニコのことはよく知らないけど、半角英数のIDが存在するなら、
wgetのダウンロード開始時に動画のIDのみを参照ファイルに書き込んで、
終了したらそのIDを消すようにして、IDが参照ファイルに書かれている間は、
そのファイルをダウンロードしないという仕組みにすればどうだろう。
でもそもそも
> 実際一部の文字がpsコマンドで「?」表示されてgrepに掛からなかったことがあり
これが分からん。idのみでgrepしたら文字化けしていてもヒットすると思うけど。 24名無しさん@お腹いっぱい。2018/08/27(月) 14:07:03.57
>>22
ファイルがオープンされているかを調べれば良いと思う
どうやるのかな
lsof が使えるなら
lsof -a -c '/^wget$/' "${filename}" 25名無しさん@お腹いっぱい。2018/08/27(月) 14:33:46.01
> ニコニコのことはよく知らないけど、半角英数のIDが存在するなら、
> wgetのダウンロード開始時に動画のIDのみを参照ファイルに書き込んで、
> 終了したらそのIDを消すようにして、IDが参照ファイルに書かれている間は、
> そのファイルをダウンロードしないという仕組みにすればどうだろう。
参照ファイルを参照してIDが無いことを確認してID書き込むまでの間に
同じ処理が走ったらチェック抜けてしまうなというのが懸案としてあります
なのでダウンロードしているファイルそのものをロックファイルにして
しかもmvコマンドの成否によって判断したらよいのではと午前中に思いました
> でもそもそも
> > 実際一部の文字がpsコマンドで「?」表示されてgrepに掛からなかったことがあり
> これが分からん。idのみでgrepしたら文字化けしていてもヒットすると思うけど。
今はIDと拡張子でgrep掛けてるので問題ないのです
(直近だと「禁書目録」がpsコマンドで「禁??録」になりプロセスチェックをスルーしていました)
でも先の参照ファイルと同じで
同じ動画に対してほぼ同時にダウンロード処理が走った場合
psコマンドを実行してから実際にwgetコマンドを実行するまでの間に
チェックを抜けてしまうことが考えられるのでどうにかしたいなと思ってます
ちょっと後出しになって申し訳ないですが
ダウンロードの処理はさまざまな状況で実行されることがあり
これからダウンロードするぞってターミナルからコマンドを打つこともありますが
cron登録していて自動でダウンロードが走るようにもしているため
そういう適当な運用でも回避できればと考えています
26名無しさん@お腹いっぱい。2018/08/27(月) 14:36:33.24
>>24
ありがとうございます
試してみたいと思いますが
lsof でチェックしてオープンされていないと判断して継続のwgetがオープンする間に
並行して実行された処理でwgetがオープンしてしまう可能性があるので・・・
シェルでやるには難しい処理でしょうか? 27名無しさん@お腹いっぱい。2018/08/27(月) 14:38:01.66
28名無しさん@お腹いっぱい。2018/08/27(月) 15:17:33.08
サーバーのサービスではなく、
ユーザは自分1人だよね。cronも動いているけど。
それなら、ミリ秒単位で処理開始がぶつかることなんて想定しなくてもよいのでは。
人命がかかっているような処理なら別だけど。
29名無しさん@お腹いっぱい。2018/08/28(火) 06:51:31.61
>>28
確かにそうですが方法が確立し実装してしまえば
動画を視聴してチェックと言う作業からほぼ解放されるので
もうちょっとやってみます
>>27
実装を試して相談したいことがあった場合検討してみます 30名無しさん@お腹いっぱい。2018/08/28(火) 15:13:22.37
ずっと楽をするために今努力して作りこむってのは間違っていない
まあ出来ないと思うときは妥協は必要だが
31名無しさん@お腹いっぱい。2018/08/28(火) 15:25:38.94
>>26
ファイルに対応する「ロックファイル」を作って、その存在確認をするのが定石だったみたい
既にロックファイルが存在していたら、別のプロセスがファイルを使っていると見做す
その際ロックファイルの存在確認と作成を「同時」(アトミック)に行うのが大事だそうで
そのファイル、安全にロックできていますか?(アトミックなファイル操作:後編)
https://heartbeats.jp/hbblog/2013/10/atomic03.html
こんな感じかな
lockfile="${outputfile}".lock
if ln -s -- $$ "${lockfile}" 2>/dev/null; then
(
unlock() { rm -- "${lockfile}"; }
trap "unlock" EXIT HUP INT QUIT SEGV TERM
wget -c -O "${outputfile}" "${url}"
) &
fi 32名無しさん@お腹いっぱい。2018/08/29(水) 09:19:34.39
$ yotei.py 201808290900
って感じでスクリプトの引数に今日の年月日0900(date +%Y%m%d0900)を入れて実行したいです。
cronで実行したいのですが、date +%Y%m%d0900の出力をyotei.pyの引数に入れるには、1行でどうやって書いたらいいですか?
33名無しさん@お腹いっぱい。2018/08/29(水) 09:26:24.72
$ yotei.py namae 201808290900
だったので、2番目の引数にdate +%Y%m%d0900の出力を入れたいです。
34名無しさん@お腹いっぱい。2018/08/29(水) 09:54:06.25
すぐ思いついたのはシェルスクリプトを1個増やして以下のようにする
export ymd0900=`date +%Y%m%d0900`
yotei.py namae $ymd0900
それをcronから呼ぶ
35名無しさん@お腹いっぱい。2018/08/29(水) 10:03:21.87
36名無しさん@お腹いっぱい。2018/08/29(水) 10:16:33.10
>>34
>>35
どうもありがとうございます!
ファイルを増やしたくなかったので1行でやりたかったんですが、ウィキペディアのその項目のとおり、エスケープ\を入れる事で1行で出来ました!
yotei.py 名前 $(date +\%Y\%m\%d0900) 37名無しさん@お腹いっぱい。2018/08/30(木) 20:22:06.89
サマータイム導入に気をつけろよ
ローカルタイム使ってると同じ日時が
2回でてくることになるぜ
38名無しさん@お腹いっぱい。2018/08/31(金) 06:31:36.33
EUじゃサマータイムは廃止だっていうのにマジで日本はこれから導入するのか?
趣味でプログラム作ってるだけなのに余計な処理増えるのはホント困る…。
39名無しさん@お腹いっぱい。2018/09/09(日) 01:40:34.50
>>22
youtube-dlならニコニコにも対応してるしタイトルとIDそのままで保存できるよ
但しここ数年の動画はDL速度が極端に遅い上に途中で必ず落ちる
[download] 5.6% of 202.83MiB at 98.22KiB/s ETA 33:15[download] Got server HTTP error: Downloaded 12014750 bytes, expected 212678720 bytes. Retrying (attempt 1 of 10)...
ERROR: unable to download video data: HTTP Error 403: Forbidden
永続リトライ設定でもこうなるししmpvでも再生中断するからな
昔のflvなんかは高速だけど年代で仕様が違う辺りエロサイトより酷い 40名無しさん@お腹いっぱい。2018/09/09(日) 08:27:37.92
東京オリンピックまでにサマータイム導入
てのはどう考えても物理的に不可能だから
話は立ち消えになるだろうけど、将来、
導入されないとも限らない
ローカルタイムを出力するときは必ず
timezoneを付けておいたほうがいい
41名無しさん@お腹いっぱい。2018/09/09(日) 12:38:12.16
>>40
YAGNI。必要になってから対応するよw 42名無しさん@お腹いっぱい。2018/09/09(日) 19:40:32.45
あっちのスレめっちゃ荒れてるじゃん
43名無しさん@お腹いっぱい。2018/09/10(月) 08:35:40.82
44名無しさん@お腹いっぱい。2018/09/10(月) 09:38:34.63
>>42
このスレ立てた奴が荒らしに行ってるからな。
あっちの板に嫌がらせで重複スレまで立てるという性格の悪さ。
そういう悪人の立てたこのスレ使ってると、悪人の一味みたいな立ち位置に属することになるぜ。 45名無しさん@お腹いっぱい。2018/09/10(月) 10:02:10.94
>>43
要件による。どうしたらいいかは客にでも聞いてこい 46名無しさん@お腹いっぱい。2018/09/10(月) 16:10:33.13
ゴリホーモの嫌がらせ陰湿やなあ
47名無しさん@お腹いっぱい。2018/09/10(月) 16:45:10.08
なんのためにプログラム板に移動したんんだっけ?
人を増やすため?
48名無しさん@お腹いっぱい。2018/09/10(月) 21:52:59.04
>>47
前スレで荒らしが出たからIDやワッチョイをつけたかったんだけど、
UNIX板ではつけられなかったから。
で、荒らしはIDつくのが嫌で新スレが立った後からこのスレを立て(>>10-15)、
さらには新スレを荒らしに行ってるってのが現状。 49名無しさん@お腹いっぱい。2018/09/11(火) 12:13:26.79
でもIDつくのが嫌だったんでしょう?
IDつくのが嫌じゃなくなったってこと?
50名無しさん@お腹いっぱい。2018/09/11(火) 13:49:11.52
>>49
IDつくと自分が荒らしてることが分かるから嫌だったけど、
向こうのスレについてはスレ自体を敵視しているから、
自分が荒らしてることがバレバレであっても、スレを使いづらくしたい
ってことじゃないかな。 51名無しさん@お腹いっぱい。2018/09/11(火) 15:12:37.72
でもこのスレも使いづらくしてたんでしょう?
52名無しさん@お腹いっぱい。2018/09/11(火) 17:42:07.09
>>51
ム板の本スレは意図的に荒らしてて(だからバレてもOK)、
前スレは天然で荒らしてる面がある(だからバレたくない)
って程度の違いはありそうだね。 53名無しさん@お腹いっぱい。2018/09/12(水) 04:28:30.52
>>52
いやいや、単に荒らしは最初から隠すつもりもなく、
バレようがバレまいが関係ないんだよ。
荒らしにとってはは最初から隠してるわけでもないが、
でもこのスレの住民がその荒らしのIDを見たくて移動したんでしょ?
それでんで、見て何がしたかったのか不明だけどなw
IDが出ていれば荒らされないとでも思った? 54名無しさん@お腹いっぱい。2018/09/12(水) 08:39:27.35
55名無しさん@お腹いっぱい。2018/09/12(水) 13:03:52.35
56名無しさん@お腹いっぱい。2018/09/12(水) 13:57:49.01
IDを何に使うかなんて自明でしょ。
まさか分からないってことはないよな?
57名無しさん@お腹いっぱい。2018/09/13(木) 04:39:22.11
荒らしをNGIDにして見えなくするため、という説がある
確かにNGIDにすると見えなくなるが、
荒らしの書き込みを止めることはできない
荒らしはどんどん自分の意見を書き込むが
それに対しての反論はできない。
なぜなら荒らしの書き込みが見えないから
荒らしとNGIDに入れてない人とのやり取りでスレは埋まっていく
はたから見れば、話についてこれず時々レスするが
荒らしに論破され何も言い返せない構図のできあがり
それ全体の荒らしの濃度が高まる
そしてIDは変わるから毎日の登録作業が増える。
忘れるとついレスをしてしまう
58名無しさん@お腹いっぱい。2018/09/13(木) 09:15:51.30
というわけで、以下のどっちかの運用にするのがよくあるパターンだな。
・このIDは昔から粘着してる奴だから無視するぜってコメントを時々入れつつ無視する
・奇特な人物がいちいち反論するので、スレにいる他のメンバーは、連鎖アボーン設定して安心してその議論全体を無視する
IDがないとこういう回避ができないから、ひたすら我慢することになる。
59名無しさん@お腹いっぱい。2018/09/13(木) 15:25:23.10
連鎖あぼーんって荒らしが誰だれかれ構わずレスしたら
みんな消えちゃうの?
60名無しさん@お腹いっぱい。2018/09/13(木) 15:40:35.15
それを荒らしにわざわざ教えてやる理由はないな。
61名無しさん@お腹いっぱい。2018/09/13(木) 15:45:05.41
お前が荒らしだろ
62名無しさん@お腹いっぱい。2018/09/13(木) 15:45:42.12
バレたかw
63名無しさん@お腹いっぱい。2018/09/13(木) 15:46:13.40
まあ回線切ってIPアドレスを変えればいいだけだしな
64名無しさん@お腹いっぱい。2018/09/13(木) 20:00:10.94
65名無しさん@お腹いっぱい。2018/09/13(木) 21:16:50.93
つまりIDやIPアドレスを変えてNG避けする意志のある荒らしってことだから、
IPアドレスも表示させるようにして、
IPアドレスの範囲を使ってNG登録するのもやむなしってことだな。
今でも2つのプロバイダーを使い分けて自演してるって
自分でバラしてたから、NG登録する範囲も2通りは必要だと。
66名無しさん@お腹いっぱい。2018/09/15(土) 09:20:57.31
特定文字列の除外リストを元に除外処理をしたいんだけど
リストとかあきらめてgrepをフィルタファイルとして別するのが一番楽?
やりたいのは以下のようなことなんだけど
シェルスクリプトなのにプログラミング的なことやって
grepのフィルタを組み立てることに違和感を感じてる(面倒とはっきり言えって?)
echo ${DATA_REC} | grep -e AAA -e BBB -e CCC
if [ $? -eq 0 ]
then
continue
fi
# 継続処理
67名無しさん@お腹いっぱい。2018/09/15(土) 09:24:06.05
> grepをフィルタファイルとして別するのが一番楽?
ってのはファイルにgrepのコマンドを書いてreadで読んで
echo ${DATA_REC} ${grep_cmd}
とかにするってことね
grepコマンドが書かれてたら適用
書かれてなかったらスルーって感じ
68名無しさん@お腹いっぱい。2018/09/15(土) 09:26:44.49
ああパイプがうまくいかないから若干判定が必要か・・・
pi@melchior /tmp $ export grep_cmd=" | grep -e AA -e BB"
pi@melchior /tmp $ echo AAA $grep_cmd
AAA | grep -e AA -e BB
pi@melchior /tmp $ echo AAA | $grep_cmd
-bash: |: command not found
pi@melchior /tmp $ export grep_cmd=" grep -e AA -e BB"
pi@melchior /tmp $ echo AAA | $grep_cmd
AAA
pi@melchior /tmp $
69名無しさん@お腹いっぱい。2018/09/15(土) 10:04:14.90
もうベタで書いてしまった・・・
でも順調!すげーよく動いてる!
この件は今後の課題にしよう
70名無しさん@お腹いっぱい。2018/09/15(土) 11:49:54.77
除外する文字列をファイルに入れて
grep -f か grep -v -f でいいような気がする
71名無しさん@お腹いっぱい。2018/09/15(土) 12:13:24.53
>>66
> シェルスクリプトなのにプログラミング的なことやって
シェル芸じゃなくてスクリプトなんだから
プログラミングで当たり前だよw 72712018/09/15(土) 12:37:34.28
>>67
少し考えてみたが、俺もgrepの-fオプションを利用するのが一番楽だと思うな
ただ昔、除外リストの否定とかやりたかったんで書いたことはあるが 73712018/09/15(土) 12:43:55.58
grep -f 使えばいいから不要だが
お手軽に>>66のようなことをするのならこうかな
リストにスペースなどが入っていたらうまくいかんがw
文字列の組み立ての参考として
echo ${DATA_REC} | grep $(printf ' -e %s' $(cat list)) 74名無しさん@お腹いっぱい。2018/09/22(土) 07:11:59.06
シェルスクリプトじゃなくてシェルの基礎を訊いてアレだけど
bashの$()と``って使い分けた方がいいの?
端末ではバッククォート多用してるけども
75名無しさん@お腹いっぱい。2018/09/22(土) 09:23:42.74
``は古い書き方。ネストができないという欠点が有る
bashに限らず、$()を使ったほうが良い。欠点は文字が一文字多くなるだけ
76名無しさん@お腹いっぱい。2018/09/22(土) 10:20:58.39
きっちりエスケープすればネストはできるよ。もちろん推奨はせんが
77名無しさん@お腹いっぱい。2018/10/07(日) 11:42:06.75
78名無しさん@お腹いっぱい。2018/10/13(土) 19:33:57.01
79名無しさん@お腹いっぱい。2018/11/09(金) 16:05:12.56
test $(date +%w) -eq 5
今日が金曜日なら5が出るんですが、-eq というのはコマンドなのかtestコマンドのオプションなのか、これは何ですか?
80名無しさん@お腹いっぱい。2018/11/09(金) 16:08:05.57
自己レス
-eq はtestコマンドのオプションで、==の事みたいですね
81名無しさん@お腹いっぱい。2018/11/09(金) 16:09:52.77
test コマンドのオプションです。
ところで今日は金曜日ですが5は出ませんよね。
戻り値は0となりますが……何か勘違いしている気がします。
82名無しさん@お腹いっぱい。2018/11/09(金) 16:18:31.36
すみません
test $(date +%w) -eq 5 && echo "今日は金曜日!"
これだと、金曜日だとechoが実行されました
83名無しさん@お腹いっぱい。2018/11/09(金) 16:20:38.51
>>82
自己レス
金曜日かどうか調べて金曜日なら戻り値は0、
で、戻り値が0の場合echoが実行されるって事ですね 84名無しさん@お腹いっぱい。2018/11/09(金) 16:32:51.67
毎月第2月曜日と毎月第2週の月曜日とでは、指す日にちってもしかして異なります?
0 17 8-14 * test $(date +%w) -eq 5 && command
こんな風にcronで毎月第2金曜日とか指定したいんですが、
例えば今月の5日で言うと、5日は1回目の月曜日だけど、月の2週目にあるので疑問に思いました。
0 17 8-14 * test $(date +%w) -eq 1 && command
これだと今週の月曜日には実行するされないですよね?
85名無しさん@お腹いっぱい。2018/11/10(土) 02:31:24.55
読みづらい。testなんて使うな
[ $(date +%w) -eq 5 ] && echo "今日は金曜日!"
86名無しさん@お腹いっぱい。2018/11/10(土) 10:01:16.06
>>85
[ ]ってなんですか?
ググろうにも記号なのでググれないです 87名無しさん@お腹いっぱい。2018/11/10(土) 10:12:06.10
man [
88名無しさん@お腹いっぱい。2018/11/10(土) 18:00:25.18
bash(バージョン 4.4.12(1)-release)でスクリプト書いててちょっと謎が
$ a=1; b=2; [[ ${a}<=${b} ]]; echo $?
こうするとちゃんと終了コードの0が返ってきますが
$ a=1; b=2; [[ ${a} <= ${b} ]]; echo $?
比較演算子の前後にスペースを入れると「条件式に構文エラーがあります」「`${b}' 周辺に構文エラーがあります」と怒られます
$ a=1; b=2; [[ ${a} < ${b} ]]; echo $?
比較演算子をleでなくltにするとまた0が返ります
これって何故なんでしょう?
89名無しさん@お腹いっぱい。2018/11/10(土) 19:37:33.60
90882018/11/10(土) 21:37:24.33
>>89
さっそくありがとうございます
そうか、イコールをつけない不等号で上手く動いてるように見えるのは、文字列として辞書順で比較してるからなんですね
どうやら私の頭の中では、二重丸括弧での算術式展開とゴッチャになってたみたいです
何時間も唸ってたのが一撃でスッキリしました。ありがとうございました 91名無しさん@お腹いっぱい。2018/11/10(土) 21:45:21.63
記号のコマンドってドットと[以外にもあるんか?
92名無しさん@お腹いっぱい。2018/11/10(土) 22:29:10.53
93名無しさん@お腹いっぱい。2018/11/11(日) 00:38:12.80
>>87
もしかしてtestと[]はだいたい同じですか?
testを使わない方がいいのはなぜなんでしょうか? 94名無しさん@お腹いっぱい。2018/11/11(日) 19:15:20.55
95名無しさん@お腹いっぱい。2018/11/11(日) 23:47:57.65
>>87
それで出てくるのは /usr/bin[ の方のmanじゃないだろうか 96名無しさん@お腹いっぱい。2018/11/15(木) 14:21:20.04
bash の場合。
$ type [
[ is a shell builtin
$ help [
[: [ arg... ]
Evaluate conditional expression.
This is a synonym for the "test" builtin, but the last argument must
be a literal `]', to match the opening `['.
97名無しさん@お腹いっぱい。2018/11/21(水) 22:42:24.51
sedで\1を変数名としていっぺんに異なる部分を異なる変数の内容で変換できませんか?
sed -e "s/<\(.*\)>/${\1}/g"
こんなかんじの
98名無しさん@お腹いっぱい。2018/11/29(木) 16:58:28.90
#!/bin/bash
# 変数URL, ETAGには既に適切な値が入ってるとする
OPT=('--header' "'If-None-Match: ${ETAG}'")
curl "${OPT[@]}" "${URL}"
こんなスクリプトを書いたけど、curlと鯖のやりとりを覗くと、リクエストヘッダのIf-None-Matchの行にシングルクォーテーションが付いて
'If-None-Match: (ETAGの値)'
と送られてしまう。で、試しにcurlの行を
echo "curl ${OPT[@]} ${URL}" > /tmp/tempfile
. /tmp/tempfile
と書き換えて実行すると、ちゃんと正常に動く。man bashを読んだりbashの引用符の扱われ方をググってみたりしても、何が何だかさっぱり分からない。
どなたか助けてくれませんか。
99名無しさん@お腹いっぱい。2018/11/29(木) 18:06:56.14
自己レス
curlだからとか関係ないな。変数にシングルクォートで囲ったものが入ってて、それをダブルクォートで囲った配列展開してるんだから、そのパラメーターはそのままシングルクォートつきになって当然。
しかし、ETAGはダブルクオートを含むしhttpリクエストヘッダはスペースを含むから、全体をシングルクォートで囲まなきゃならんのだよな。
やっぱどのタイミングでどのクォートがどう展開されるのか、一段階ずつ追いかけてみるしかないのかな
100名無しさん@お腹いっぱい。2018/11/29(木) 21:56:13.42
なんか混乱しとるなw
まあ、ダブルクォートは、他言語を使っている人からすれば
直感に反する機能だってことに、俺も最近気づいたんだけどな
ただどこがどう違うかを言葉で説明したことがわけじゃない。やってるみるか?
・シェルスクリプトは文字列として展開されて実行されているようでそうではない
・ダブルクォートは文字列を囲う機能ではなく、変数展開の挙動を変えるエスケープの一種
この二つに集約されるかなぁ
> しかし、ETAGはダブルクオートを含むし
これ関係ないんだわ
OPT=('--header' "If-None-Match: ${ETAG}")
だと
OPT=('--header' "If-None-Match: "686897696a7c876b7e"")
こうなってしまい
OPT=('--header' "If-None-Match: " 686897696a7c876b7e "")
のように解釈されると思ってしまうが違う。
別に文字列展開されてから、動くわけじゃない
ダブルクォートは「 If-None-Match: ${ETAG} 」の部分を一つの引数として
扱いますよー(ただし中の変数は展開されますよ)という意味。
変数の中にダブルクォートが入っていようが改行が入っていようが関係ない
またダブルクォートはそれだけの機能ではなく $@ が入っている場合に異なる挙動をする
"$@" が入っている場合、一つの引数ではなく複数の引数として扱われる
例えば引数$1~$5が存在する場合、"$@" は "$1" "$2" "$3" "$4" "$5" と等価
また"foo$@bar" となっていた場合、 "foo$1" "$2" "$3" "$4" "$5bar" と等価
引数が一つなら "foo$1bar" だし、引数がゼロの場合は、書かなかったのと同じとなる("" 空文字にはならない)
このように文字列として囲う機能じゃなくて、中に入ってる文字や変数の解釈の仕方に影響を与える機能
101名無しさん@お腹いっぱい。2018/11/29(木) 22:00:40.89
ちなみに "$@" を複数の引数に展開されたくなければ "$*" を使う
102名無しさん@お腹いっぱい。2018/11/30(金) 06:16:21.18
>>100-101
ありがとう。おかげで、サクッと片付きました。素直に
OPT=('--header' "If-None-Match: ${ETAG}")
curl "${OPT[@]}" "${URL}"
で何の問題もなく動作しました。最初にcurlについて調べてたときにETAGを使う例でシングルクォートが使われてたのに、ずっと脳味噌が引っ張られてたようです。
上の行で変数に入れる時点で、スペースを含む一つの文字列として扱われてるんだから、あとはその中身がなんであるかに関係なく、"$[@]"で展開すればいいわけですね。
ありがとうございました。 103名無しさん@お腹いっぱい。2018/12/25(火) 18:37:21.02
bashでログ出力処理を一括でやるにはどうすれば良いですか?
powesshellだと、Start-Transcript に対応するコマンドを教えてください
104名無しさん@お腹いっぱい。2018/12/26(水) 01:04:21.34
>>103
何がしたいのかよくわからないが
シェルスクリプト内の標準出力と標準エラー出力をファイルに出力するなら
#!/bin/bash
exec >script.log 2>&1
... 105名無しさん@お腹いっぱい。2018/12/26(水) 08:34:29.57
>>104
何したいかよくわからんって、
パワーシェルでいうStart-Transcriptをやりたいの
bashで一行ずつリダイレクトつけないとダメとかダサすぎる 106名無しさん@お腹いっぱい。2018/12/26(水) 08:47:38.26
回答ちゃんと読め
107名無しさん@お腹いっぱい。2018/12/26(水) 09:08:14.92
PowerShellなんぞ興味が無いから知らんという人が多かろう
標準出力と標準エラー出力をファイルとコンソールの両方に出したいと言えばいい
知ってるがお前の態度が気に入らない(AA略)
108名無しさん@お腹いっぱい。2018/12/26(水) 18:22:57.16
生意気だな
109名無しさん@お腹いっぱい。2018/12/26(水) 18:30:53.30
ドザはどこ行ってもあれだな
110名無しさん@お腹いっぱい。2018/12/26(水) 19:04:39.84
ドザがー ドザがー
111名無しさん@お腹いっぱい。2019/01/10(木) 14:22:50.61
やっつけ
$ {
> echo foo
> ECHO bar
> } 2>&1 | tee result.txt
foo
ECHO: コマンドが見つかりません
112名無しさん@お腹いっぱい。2019/01/26(土) 23:47:05.51
113名無しさん@お腹いっぱい。2019/01/28(月) 19:18:42.39
・MANWIDTH=ttyのときはmanの標準出力1の横幅を取得したい。
・sttyの操作対象端末は標準入力0で、出力先は標準出力1。
・a>&b は dup2(b,a) のことで、左を使うと実体は右になる。
・標準エラー出力2は捨てる。
という前提で、
sizes=$($STTY size 0>&1 2>/dev/null) と書くと、
sttyの標準出力1は$()に取られてるから、manの標準出力1とは別物になって、
正しい端末をsttyできない。
{ sizes=$($STTY size 0>&3 2>/dev/null); } 3>&1 は、1が取られ
てるなら3を中継すれば安全じゃねと書いたものと推測される。
{ sizes=$($STTY size 2>/dev/null); } 0>&1 と書けば十分なはず。
114名無しさん@お腹いっぱい。2019/01/29(火) 01:14:27.65
findした結果を1行づつ配列に代入したい場合にはどうすればよいでしょうか?
当方が書いたshellだと、検索したい文字列に空白があるケースだと
そこで要素が別れてしまいます。
array=$(find ${HOME}/animal -type d -iname "*検索したい文字列*")
115名無しさん@お腹いっぱい。2019/01/29(火) 12:56:34.68
IFSを改行のみにする
1161122019/01/30(水) 08:38:21.70
>>113
ありがとうございます!
リダイレクトにstdin/stdoutの差し替え的な使い方があるとか、sttyはstdinを見るとか、sttyがstdinを見てもstdoutを見てもそれが端末を指しているなら同じこととか、数枚目からうろこが落ちました。
しかしそもそもsttyはデフォルトのstdin見ておけばいいんじゃね、とも思ったり。command |man 的な使い方ってあったっけなぁ。 117名無しさん@お腹いっぱい。2019/02/05(火) 14:26:11.34
少々スレ違いですがお許しください
OS 組み込みの tcsh をバージョンアップしたいのですが、
シェルスクリプトの挙動が変わってしまうのが怖くて、なるべく
コンパイル時オプション(configure オプション)を揃えたいのですが
バイナリしかない場合に、コンパイル時オプションを調べる方法ってないですかね?
## 例えば ISC BIND の -V オプションみたいな
118名無しさん@お腹いっぱい。2019/02/07(木) 03:39:18.86
少々じゃないくらい違うなあ
119名無しさん@お腹いっぱい。2019/02/07(木) 03:40:20.92
しかもマルチかよ
120名無しさん@お腹いっぱい。2019/07/27(土) 21:39:15.96
ログインシェルでfishを使う時、
https://gist.github.com/mitukiii/4954559
できたらやり方教えてください
$ myCommand
タブキー押すと
$ myCommand
foo -- do foo
bar -- do bar
unk -- do toilet
って候補と1行説明表示されて
$ myCommand f
でタブーキー押すと
$ myCommand foo
と補完される
方法を知りたいです
これできたら重いzshから魚に乗り換えられる 121名無しさん@お腹いっぱい。2019/07/30(火) 12:52:38.09
ここはシェルスクリプトのスレです。
シェルの使い方のスレではありません。
スクリプトの話をしてください
122名無しさん@お腹いっぱい。2019/07/30(火) 22:27:15.09
具体的に何を語ったらいいの
123名無しさん@お腹いっぱい。2019/07/31(水) 19:16:20.41
シェルスクリプトだけで実装した一番高速なFizzBuzzはどんなものかとか
124名無しさん@お腹いっぱい。2019/08/01(木) 10:04:58.33
yash使てる?
125名無しさん@お腹いっぱい。2019/08/01(木) 14:04:09.49
使えてないという報告は一つもない
126名無しさん@お腹いっぱい。2019/08/01(木) 22:41:59.49
「使てる(つこてる)?」は「使っていますか?」という意味の質問であって、使用可能かどうかを聞いてる訳では無いのでは
127名無しさん@お腹いっぱい。2019/08/01(木) 23:04:57.30
真面目君か
128名無しさん@お腹いっぱい。2019/08/05(月) 09:18:07.69
ほにゃらら
ほんじゃらら
かきく
0 あいう
かきく
1 あいう
かきく
2 あいう
かきく
3 あいう
かきく
4 あいう
かきく
5 あいう
さしすせそ
と書かれたテキストファイルを作りたいです
echo -e ほにゃらら"\n"ほんじゃらら > index.txt
seq -f "%g あいう" 0 5 > index.txt
ここまではわかったんですが、seqで連番を書き出す時に番号と番号の間の行に「かきく」を入れて最後の行に「さしすせそ」を加えるやり方教えてほしいです
129名無しさん@お腹いっぱい。2019/08/05(月) 10:32:33.45
awkとかじゃいかんの
130名無しさん@お腹いっぱい。2019/08/05(月) 11:55:34.38
>>129
ありがとうございます
調べてみました
cat > index.txt << "EOF"
ほにゃらら
ほんじゃらら
あいう
EOF
seq 0 5 | awk -v 'ORS= あいう\nかきく\n' '{print $1}' >> index.txt
echo さしす >> index.txt 131名無しさん@お腹いっぱい。2019/08/05(月) 11:55:45.48
こうやると
ほにゃらら
ほんじゃらら
あいう
0 あいう
かきく
1 あいう
かきく
2 あいう
かきく
3 あいう
かきく
4 あいう
かきく
5 あいう
かきく
さしす
と出力されました
最後から2行目の「かきく」を出さないやり方が分からないです
132名無しさん@お腹いっぱい。2019/08/05(月) 12:05:17.31
ブレース展開
133名無しさん@お腹いっぱい。2019/08/05(月) 12:11:44.60
一応これでうまくいきました
cat > index.txt << "EOF"
ほにゃらら
ほんじゃらら
かきく
EOF
seq 0 5 | awk -v 'ORS= あいう\nかきく\n' '{print $1}' >> index.txt
sed -i -e '$d' index.txt
echo さしす >> index.txt
134名無しさん@お腹いっぱい。2019/08/05(月) 12:13:50.09
>>132
自分のやり方はなだったらしそうなのでそのキーワード調べてみます 135名無しさん@お腹いっぱい。2019/08/05(月) 12:28:22.64
えー、難しい...
俺>>129はこんなもんしか考えてなかったけど
awk 'BEGIN{print"ほにゃらら\nほんじゃらら";for(i=0;i<6;i++){printf"かきく\n%d あいう\n",i};print"さしすせそ"}' 136名無しさん@お腹いっぱい。2019/08/05(月) 12:28:39.74
>>128
cat <<END >index.txt
ほにゃらら
ほんじゃらら
$(printf 'かきく\n%s あいう\n' $(seq 0 5))
さしすせそ
END 137名無しさん@お腹いっぱい。2019/08/05(月) 12:29:43.26
あ、バックスラッシュが円記号になってしまった...
138名無しさん@お腹いっぱい。2019/08/05(月) 12:30:25.69
cat > index.txt << "EOF"
ほにゃらら
ほんじゃらら
EOF
printf "かきく\n%s\n" {0..5}あいう >> index.txt
これだと大分短くて出来たけど、数字と「あいう」の間にスペースが入れられない
139名無しさん@お腹いっぱい。2019/08/05(月) 12:32:03.53
被ってしまった
みなさんありがとうございます
質問ぬしの自分は>>138です
135と136のやり方調べてみます 140名無しさん@お腹いっぱい。2019/08/05(月) 12:43:19.31
>>136
catで書き出すファイルの中でprintfをやって、そのrintfの中でseqで連番作るんでね
これだとファイルへの書き込みは1回ですみますね
>>135
これも> index.txtで終えれば1回ですみますね
だけどawk難しいです
がんばって135のやり方理解できるようにします 141名無しさん@お腹いっぱい。2019/08/05(月) 13:06:08.43
>>140
> これだとファイルへの書き込みは1回ですみますね
どんな方法で作るにせよ { } で括れば一回にまとめられるよ
{
printf '%s\n' 'ほにゃらら'
printf '%s\n' 'ほんじゃらら'
printf 'かきく\n%s あいう\n' $(seq 0 5)
printf '%s\n' 'さしすせそ'
} >index.txt 142名無しさん@お腹いっぱい。2019/08/05(月) 15:17:00.15
>>141
こんな方法もあるんですね
ありがとうございます
curlの標準出力の6行目を変数に入れて他の文字列と組み合わせて標準出力に出力したいです。
URL="hoge"
ROKU="curl -sS $URL | sed -n '6p'"
echo "あいうえお"$ROKU"さしすせそ"
しかし結果はこうなりました
あいうえおcurl -sS hoge | sed -n '6p'さしすせそ 143名無しさん@お腹いっぱい。2019/08/05(月) 15:18:57.84
144名無しさん@お腹いっぱい。2019/08/05(月) 16:33:57.17
printf "あいうえお"
$ROKU #chomp のように\nを消すパイプ必要だと思う
printf "さしすせそ"
145名無しさん@お腹いっぱい。2019/08/05(月) 17:18:21.98
>>144
echoじゃなくてprintfなら改行されないからあいうえおに続けて書けますね
だけど、このままだとROKUのところで改行されてしまうからさしすせそは2行目に来ちゃいますね 146名無しさん@お腹いっぱい。2019/08/05(月) 18:01:04.99
>>128
> と書かれたテキストファイルを作りたいです
こうすれば良いのでは?
cat<<HERE > index.txt
ほにゃらら
ほんじゃらら
かきく
0 あいう
かきく
1 あいう
かきく
2 あいう
かきく
3 あいう
かきく
4 あいう
かきく
5 あいう
さしすせそ
HERE 147名無しさん@お腹いっぱい。2019/08/05(月) 19:41:32.36
>>142
コマンドの標準出力を変数に設定したりコマンドの引数にしたりするには
「コマンド置換」 $(…) を使います
あと、「6行目」以外の部分も取り出したくなったときに curl を何度も実行したくはないので
curl と sed は分けておきたいところ
するとこんな感じ
PAGE=$(curl -sS "$URL")
ROKU=$(printf '%s\n' "$PAGE" | sed -n '6p')
NANA=$(printf '%s\n' "$PAGE" | sed -n '7p')
printf 'あいうえお%sさしすせそ\n' "$ROKU"
printf 'かきくけこ%sたちつてと\n' "$NANA" 148名無しさん@お腹いっぱい。2019/08/06(火) 10:37:34.03
149名無しさん@お腹いっぱい。2019/08/29(木) 02:47:55.71
$ bash -c 'unset a b;echo 10|read a;let b=a+10;echo $b'
10
この動作ってPOSIX的にはどうなの?
150名無しさん@お腹いっぱい。2019/08/29(木) 05:08:51.78
読みづれーなw
bash -c '
unset a b
echo 10 | read a
# echo $a = 空
let b=a+10
echo $b
'
letはPOSIXにない
readはサブシェルなんだからaは空に決まってる
ごく普通の正しい動作
151名無しさん@お腹いっぱい。2019/08/29(木) 05:09:53.11
正しいコード
bash -c '
unset a b
echo 10 | {
read a
let b=a+10
echo $b
}
'
152名無しさん@お腹いっぱい。2019/08/29(木) 23:22:24.50
letまで考えて無かったすまん
まあ説明の為なのでそこは目をつぶってくれたまい
opensuzeなんだけども
$ ksh -c 'unset a b;echo 10|read a;let b=a+10;echo $b'
20
$
この動作ってPOSIX的にはどうなの?
153名無しさん@お腹いっぱい。2019/08/30(金) 06:34:55.40
バグ
154名無しさん@お腹いっぱい。2019/09/10(火) 19:48:12.68
curlのやり方教えてください
ブラウザのフォームにjsonを書いてポストボタンを押すとokが出るけどターミナルからcurlでやろうとすると、ボディが空だとなり送信出来ません
書き方間違えていますか?
155名無しさん@お腹いっぱい。2019/09/11(水) 14:49:50.58
ブラウザの開発ツールからcURLでコピーした方が早そうだぞ
156名無しさん@お腹いっぱい。2019/09/11(水) 15:08:13.17
>>155
どうもありがとうございます
-H 'Content-Type: application/json'
を付けたら動きました 157名無しさん@お腹いっぱい。2019/09/12(木) 17:05:57.53
アプリの起動判定をしたいんですが
ps -alxw | grep アプリ名
2行より多ければアプリが起動してるんだと思いますけど確実な方法ありますか?
158名無しさん@お腹いっぱい。2019/09/12(木) 17:48:19.11
killall -0 アプリ名
とか?
159名無しさん@お腹いっぱい。2019/09/12(木) 19:39:47.90
>>158
どうもありがとうございます
そのコマンドで何も変えらなかったら起動中という事であってますか? 160名無しさん@お腹いっぱい。2019/09/13(金) 07:33:53.20
起動してないとわかっても、その直後に起動することも有るから
ロックを掛けないと確実にはならないけどな
161名無しさん@お腹いっぱい。2019/09/14(土) 01:15:30.85
pgrepでええやん、と思ったけど環境依存か
162名無しさん@お腹いっぱい。2019/09/14(土) 02:03:14.71
>>160
どの環境でも使えるロックの機構ってなにかある? 163名無しさん@お腹いっぱい。2019/09/14(土) 03:45:32.29