- 1 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/08/02(木) 05:22:16.82 .net]
- シェルスクリプトの総合スレです。
□お約束 ・特記なき場合はBourne Shell(/bin/sh)もしくはPOSIX準拠の互換シェルがデフォルトです。 bash/zsh/ksh/ash/dash/yash/poshなどの専用機能に依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。 FreeBSDユーザは/bin/shの正体がashなので注意。 ・POSIXについてのリンクは https://en.wikipedia.org/wiki/POSIX にまとめられています 最新の仕様はこちらへ pubs.opengroup.org/onlinepubs/9699919799/ (左上の「Shell & Utilities」 から参照することができます。) ・v7 shに一番近くて、現役(?)のshは、OpenSolaris由来のheirloom sh。 src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/ heirloom.sourceforge.net/sh.html ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) ・シェルスクリプトのことをシェルってゆうな □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも awkまたはperlの方が適した
- 21 名前:名無しさん@お腹いっぱい。 [2018/08/05(日) 08:04:43.32 .net]
- fishをログインシェルとして使ってます
zshの場合bindkey "\e[A" history-beginning-search-backward-end で数文字入力して上矢印キーを押すと直近の履歴から保管されますが fishでこれをしたい場合どうすればいいのでしょうか? fishだとデフォルトで右矢印キーがこの動作になるようですが これを上矢印キーにしたいところです。
- 22 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/08/05(日) 08:21:50.23 .net]
- ~ > 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
- 23 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/08/27(月) 12:16:09.32 .net]
- wgetを使ってシェルスクリプトでダウンロードツールを作ったんだけど
ナロー回線だから出来るだけ無駄を省きたくて -cオプションで既存ダウンロード分に追記する形にしてる でも当然ならがコマンドが2重に発行されたらぐちゃぐちゃになるから psコマンドでwgetを2重発行しないようにしてるけどちょっと不安 実際一部の文字がpsコマンドで「?」表示されてgrepに掛からなかったことがあり ファイルが壊れたことがあった ぶっちゃけダウンロードしてるのはニコニコの動画であり (動画なんで視聴しないと壊れてるのかわからず厄介) ID_タイトル.mp4とかの形式で保存してるんだけど 問題はマルチバイト文字のタイトルだから 「grep "${id}.*${extention}"」として回避 実際はもうちょっとコマンドの詳細まで見てるけど こんな場合のベストってダウンロード先のファイル名に プロセスID(wgetを実行するシェルスクリプトのプロセスID)を含めるようにして 状況に応じてファイル名を変えながらwgetするくらいしかないのかな? 既存ダウンロード分のmvに成功したらwgetするとかで ファイルをロックする相当の処理を実現するイメージなんだけど ちなみにナローじゃない回線を使うことがあったり ダウンロード中に止まることがあるため 複数の動画を同時並行でダウンロードするつくりにしているため この問題はぜひとも回避したいです
- 24 名前:名無しさん@お腹いっぱい。 [2018/08/27(月) 12:48:42.73 .net]
- >>22
>複数の動画を同時並行でダウンロードするつくり なんでlockファイルで二重起動を防止しないのだろうと思ったら、 同時並列でwgetを実行したいけど、 1つの動画については多重実行されないようにしたい、ということか。 ニコニコのことはよく知らないけど、半角英数のIDが存在するなら、 wgetのダウンロード開始時に動画のIDのみを参照ファイルに書き込んで、 終了したらそのIDを消すようにして、IDが参照ファイルに書かれている間は、 そのファイルをダウンロードしないという仕組みにすればどうだろう。 でもそもそも > 実際一部の文字がpsコマンドで「?」表示されてgrepに掛からなかったことがあり これが分からん。idのみでgrepしたら文字化けしていてもヒットすると思うけど。
- 25 名前:名無しさん@お腹いっぱい。 [2018/08/27(月) 14:07:03.57 .net]
- >>22
ファイルがオープンされているかを調べれば良いと思う どうやるのかな lsof が使えるなら lsof -a -c '/^wget$/' "${filename}"
- 26 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/08/27(月) 14:33:46.01 .net]
- > ニコニコのことはよく知らないけど、半角英数のIDが存在するなら、
> wgetのダウンロード開始時に動画のIDのみを参照ファイルに書き込んで、 > 終了したらそのIDを消すようにして、IDが参照ファイルに書かれている間は、 > そのファイルをダウンロードしないという仕組みにすればどうだろう。 参照ファイルを参照してIDが無いことを確認してID書き込むまでの間に 同じ処理が走ったらチェック抜けてしまうなというのが懸案としてあります なのでダウンロードしているファイルそのものをロックファイルにして しかもmvコマンドの成否によって判断したらよいのではと午前中に思いました > でもそもそも > > 実際一部の文字がpsコマンドで「?」表示されてgrepに掛からなかったことがあり > これが分からん。idのみでgrepしたら文字化けしていてもヒットすると思うけど。 今はIDと拡張子でgrep掛けてるので問題ないのです (直近だと「禁書目録」がpsコマンドで「禁??録」になりプロセスチェックをスルーしていました) でも先の参照ファイルと同じで 同じ動画に対してほぼ同時にダウンロード処理が走った場合 psコマンドを実行してから実際にwgetコマンドを実行するまでの間に チェックを抜けてしまうことが考えられるのでどうにかしたいなと思ってます ちょっと後出しになって申し訳ないですが ダウンロードの処理はさまざまな状況で実行されることがあり これからダウンロードするぞってターミナルからコマンドを打つこともありますが cron登録していて自動でダウンロードが走るようにもしているため そういう適当な運用でも回避できればと考えています
- 27 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/08/27(月) 14:36:33.24 .net]
- >>24
ありがとうございます 試してみたいと思いますが lsof でチェックしてオープンされていないと判断して継続のwgetがオープンする間に 並行して実行された処理でwgetがオープンしてしまう可能性があるので・・・ シェルでやるには難しい処理でしょうか?
- 28 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/08/27(月) 14:38:01.66 .net]
- >>22
>>1-15 あたりをご覧になると分かりとおり、 このスレは荒らしが立てて維持しています。 特段の理由がなければ本スレ mevius.5ch.net/test/read.cgi/tech/1532397676/ の利用をお勧めします。
- 29 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/08/27(月) 15:17:33.08 .net]
- サーバーのサービスではなく、
ユーザは自分1人だよね。cronも動いているけど。 それなら、ミリ秒単位で処理開始がぶつかることなんて想定しなくてもよいのでは。 人命がかかっているような処理なら別だけど。
- 30 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/08/28(火) 06:51:31.61 .net]
- >>28
確かにそうですが方法が確立し実装してしまえば 動画を視聴してチェックと言う作業からほぼ解放されるので もうちょっとやってみます >>27 実装を試して相談したいことがあった場合検討してみます
- 31 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/08/28(火) 15:13:22.37 .net]
- ずっと楽をするために今努力して作りこむってのは間違っていない
まあ出来ないと思うときは妥協は必要だが
- 32 名前:名無しさん@お腹いっぱい。 [2018/08/28(火) 15:25:38.94 .net]
- >>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
- 33 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/08/29(水) 09:19:34.39 .net]
- $ yotei.py 201808290900
って感じでスクリプトの引数に今日の年月日0900(date +%Y%m%d0900)を入れて実行したいです。 cronで実行したいのですが、date +%Y%m%d0900の出力をyotei.pyの引数に入れるには、1行でどうやって書いたらいいですか?
- 34 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/08/29(水) 09:26:24.72 .net]
- $ yotei.py namae 201808290900
だったので、2番目の引数にdate +%Y%m%d0900の出力を入れたいです。
- 35 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/08/29(水) 09:54:06.25 .net]
- すぐ思いついたのはシェルスクリプトを1個増やして以下のようにする
export ymd0900=`date +%Y%m%d0900` yotei.py namae $ymd0900 それをcronから呼ぶ
- 36 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/08/29(水) 10:03:21.87 .net]
- >>33
https://ja.wikipedia.org/wiki/Crontab よくあるミス でそのもののようなのあるけど
- 37 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/08/29(水) 10:16:33.10 .net]
- >>34
>>35 どうもありがとうございます! ファイルを増やしたくなかったので1行でやりたかったんですが、ウィキペディアのその項目のとおり、エスケープ\を入れる事で1行で出来ました! yotei.py 名前 $(date +\%Y\%m\%d0900)
- 38 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/08/30(木) 20:22:06.89 .net]
- サマータイム導入に気をつけろよ
ローカルタイム使ってると同じ日時が 2回でてくることになるぜ
- 39 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/08/31(金) 06:31:36.33 .net]
- EUじゃサマータイムは廃止だっていうのにマジで日本はこれから導入するのか?
趣味でプログラム作ってるだけなのに余計な処理増えるのはホント困る…。
- 40 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/09(日) 01:40:34.50 .net]
- >>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なんかは高速だけど年代で仕様が違う辺りエロサイトより酷い
- 41 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/09(日) 08:27:37.92 .net]
- 東京オリンピックまでにサマータイム導入
てのはどう考えても物理的に不可能だから 話は立ち消えになるだろうけど、将来、 導入されないとも限らない ローカルタイムを出力するときは必ず timezoneを付けておいたほうがいい
- 42 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/09(日) 12:38:12.16 .net]
- >>40
YAGNI。必要になってから対応するよw
- 43 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/09(日) 19:40:32.45 .net]
- あっちのスレめっちゃ荒れてるじゃん
- 44 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/10(月) 08:35:40.82 .net]
- >>40
どうやって対応したらよい?
- 45 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/10(月) 09:38:34.63 .net]
- >>42
このスレ立てた奴が荒らしに行ってるからな。 あっちの板に嫌がらせで重複スレまで立てるという性格の悪さ。 そういう悪人の立てたこのスレ使ってると、悪人の一味みたいな立ち位置に属することになるぜ。
- 46 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/10(月) 10:02:10.94 .net]
- >>43
要件による。どうしたらいいかは客にでも聞いてこい
- 47 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/10(月) 16:10:33.13 .net]
- ゴリホーモの嫌がらせ陰湿やなあ
- 48 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/10(月) 16:45:10.08 .net]
- なんのためにプログラム板に移動したんんだっけ?
人を増やすため?
- 49 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/10(月) 21:52:59.04 .net]
- >>47
前スレで荒らしが出たからIDやワッチョイをつけたかったんだけど、 UNIX板ではつけられなかったから。 で、荒らしはIDつくのが嫌で新スレが立った後からこのスレを立て(>>10-15)、 さらには新スレを荒らしに行ってるってのが現状。
- 50 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/11(火) 12:13:26.79 .net]
- でもIDつくのが嫌だったんでしょう?
IDつくのが嫌じゃなくなったってこと?
- 51 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/11(火) 13:49:11.52 .net]
- >>49
IDつくと自分が荒らしてることが分かるから嫌だったけど、 向こうのスレについてはスレ自体を敵視しているから、 自分が荒らしてることがバレバレであっても、スレを使いづらくしたい ってことじゃないかな。
- 52 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/11(火) 15:12:37.72 .net]
- でもこのスレも使いづらくしてたんでしょう?
- 53 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/11(火) 17:42:07.09 .net]
- >>51
ム板の本スレは意図的に荒らしてて(だからバレてもOK)、 前スレは天然で荒らしてる面がある(だからバレたくない) って程度の違いはありそうだね。
- 54 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/12(水) 04:28:30.52 .net]
- >>52
いやいや、単に荒らしは最初から隠すつもりもなく、 バレようがバレまいが関係ないんだよ。 荒らしにとってはは最初から隠してるわけでもないが、 でもこのスレの住民がその荒らしのIDを見たくて移動したんでしょ? それでんで、見て何がしたかったのか不明だけどなw IDが出ていれば荒らされないとでも思った?
- 55 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/12(水) 08:39:27.35 .net]
- >>53
荒らしさん、こんにちはー
- 56 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/12(水) 13:03:52.35 .net]
- >>54
はい、こんにちは。 やっと気づいた?w
- 57 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/12(水) 13:57:49.01 .net]
- IDを何に使うかなんて自明でしょ。
まさか分からないってことはないよな?
- 58 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/13(木) 04:39:22.11 .net]
- 荒らしをNGIDにして見えなくするため、という説がある
確かにNGIDにすると見えなくなるが、 荒らしの書き込みを止めることはできない 荒らしはどんどん自分の意見を書き込むが それに対しての反論はできない。 なぜなら荒らしの書き込みが見えないから 荒らしとNGIDに入れてない人とのやり取りでスレは埋まっていく はたから見れば、話についてこれず時々レスするが 荒らしに論破され何も言い返せない構図のできあがり それ全体の荒らしの濃度が高まる そしてIDは変わるから毎日の登録作業が増える。 忘れるとついレスをしてしまう
- 59 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/13(木) 09:15:51.30 .net]
- というわけで、以下のどっちかの運用にするのがよくあるパターンだな。
・このIDは昔から粘着してる奴だから無視するぜってコメントを時々入れつつ無視する ・奇特な人物がいちいち反論するので、スレにいる他のメンバーは、連鎖アボーン設定して安心してその議論全体を無視する IDがないとこういう回避ができないから、ひたすら我慢することになる。
- 60 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/13(木) 15:25:23.10 .net]
- 連鎖あぼーんって荒らしが誰だれかれ構わずレスしたら
みんな消えちゃうの?
- 61 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/13(木) 15:40:35.15 .net]
- それを荒らしにわざわざ教えてやる理由はないな。
- 62 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/13(木) 15:45:05.41 .net]
- お前が荒らしだろ
- 63 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/13(木) 15:45:42.12 .net]
- バレたかw
- 64 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/13(木) 15:46:13.40 .net]
- まあ回線切ってIPアドレスを変えればいいだけだしな
- 65 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/13(木) 20:00:10.94 .net]
- >>59
やってみればいいんじゃね?
- 66 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/13(木) 21:16:50.93 .net]
- つまりIDやIPアドレスを変えてNG避けする意志のある荒らしってことだから、
IPアドレスも表示させるようにして、 IPアドレスの範囲を使ってNG登録するのもやむなしってことだな。 今でも2つのプロバイダーを使い分けて自演してるって 自分でバラしてたから、NG登録する範囲も2通りは必要だと。
- 67 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/15(土) 09:20:57.31 .net]
- 特定文字列の除外リストを元に除外処理をしたいんだけど
リストとかあきらめてgrepをフィルタファイルとして別するのが一番楽? やりたいのは以下のようなことなんだけど シェルスクリプトなのにプログラミング的なことやって grepのフィルタを組み立てることに違和感を感じてる(面倒とはっきり言えって?) echo ${DATA_REC} | grep -e AAA -e BBB -e CCC if [ $? -eq 0 ] then continue fi # 継続処理
- 68 名前:名無しさん@お腹いっぱい。 [2018/09/15(土) 09:24:06.05 .net]
- > grepをフィルタファイルとして別するのが一番楽?
ってのはファイルにgrepのコマンドを書いてreadで読んで echo ${DATA_REC} ${grep_cmd} とかにするってことね grepコマンドが書かれてたら適用 書かれてなかったらスルーって感じ
- 69 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/15(土) 09:26:44.49 .net]
- ああパイプがうまくいかないから若干判定が必要か・・・
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 $
- 70 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/15(土) 10:04:14.90 .net]
- もうベタで書いてしまった・・・
でも順調!すげーよく動いてる! この件は今後の課題にしよう
- 71 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/15(土) 11:49:54.77 .net]
- 除外する文字列をファイルに入れて
grep -f か grep -v -f でいいような気がする
- 72 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/15(土) 12:13:24.53 .net]
- >>66
> シェルスクリプトなのにプログラミング的なことやって シェル芸じゃなくてスクリプトなんだから プログラミングで当たり前だよw
- 73 名前:71 mailto:sage [2018/09/15(土) 12:37:34.28 .net]
- >>67
少し考えてみたが、俺もgrepの-fオプションを利用するのが一番楽だと思うな ただ昔、除外リストの否定とかやりたかったんで書いたことはあるが
- 74 名前:71 mailto:sage [2018/09/15(土) 12:43:55.58 .net]
- grep -f 使えばいいから不要だが
お手軽に>>66のようなことをするのならこうかな リストにスペースなどが入っていたらうまくいかんがw 文字列の組み立ての参考として echo ${DATA_REC} | grep $(printf ' -e %s' $(cat list))
- 75 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/22(土) 07:11:59.06 .net]
- シェルスクリプトじゃなくてシェルの基礎を訊いてアレだけど
bashの$()と``って使い分けた方がいいの? 端末ではバッククォート多用してるけども
- 76 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/22(土) 09:23:42.74 .net]
- ``は古い書き方。ネストができないという欠点が有る
bashに限らず、$()を使ったほうが良い。欠点は文字が一文字多くなるだけ
- 77 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/09/22(土) 10:20:58.39 .net]
- きっちりエスケープすればネストはできるよ。もちろん推奨はせんが
- 78 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/10/07(日) 11:42:06.75 .net]
- >>74
mywiki.wooledge.org/BashFAQ/082
- 79 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/10/13(土) 19:33:57.01 .net]
- https://imgur.com/FAF05na.jpg
- 80 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/09(金) 16:05:12.56 .net]
- test $(date +%w) -eq 5
今日が金曜日なら5が出るんですが、-eq というのはコマンドなのかtestコマンドのオプションなのか、これは何ですか?
- 81 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/09(金) 16:08:05.57 .net]
- 自己レス
-eq はtestコマンドのオプションで、==の事みたいですね
- 82 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/09(金) 16:09:52.77 .net]
- test コマンドの
- 83 名前:Iプションです。
ところで今日は金曜日ですが5は出ませんよね。 戻り値は0となりますが……何か勘違いしている気がします。 [] - [ここ壊れてます]
- 84 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/09(金) 16:18:31.36 .net]
- すみません
test $(date +%w) -eq 5 && echo "今日は金曜日!" これだと、金曜日だとechoが実行されました
- 85 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/09(金) 16:20:38.51 .net]
- >>82
自己レス 金曜日かどうか調べて金曜日なら戻り値は0、 で、戻り値が0の場合echoが実行されるって事ですね
- 86 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/09(金) 16:32:51.67 .net]
- 毎月第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 これだと今週の月曜日には実行するされないですよね?
- 87 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/10(土) 02:31:24.55 .net]
- 読みづらい。testなんて使うな
[ $(date +%w) -eq 5 ] && echo "今日は金曜日!"
- 88 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/10(土) 10:01:16.06 .net]
- >>85
[ ]ってなんですか? ググろうにも記号なのでググれないです
- 89 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/10(土) 10:12:06.10 .net]
- man [
- 90 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/10(土) 18:00:25.18 .net]
- 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が返ります これって何故なんでしょう?
- 91 名前:名無しさん@お腹いっぱい。 [2018/11/10(土) 19:37:33.60 .net]
- >>88
[[ ... ]] で使える演算子に <= は存在しない それは数の比較ではなく [[ "1" < "=2" ]] という文字列の比較になっている なので <= の右に空白を置くと [[ "1" < "=" "2" ]] となりエラー 条件式 https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBW
- 92 名前:88 mailto:sage [2018/11/10(土) 21:37:24.33 .net]
- >>89
さっそくありがとうございます そうか、イコールをつけない不等号で上手く動いてるように見えるのは、文字列として辞書順で比較してるからなんですね どうやら私の頭の中では、二重丸括弧での算術式展開とゴッチャになってたみたいです 何時間も唸ってたのが一撃でスッキリしました。ありがとうございました
- 93 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/10(土) 21:45:21.63 .net]
- 記号のコマンドってドットと[以外にもあるんか?
- 94 名前:名無しさん@お腹いっぱい。 [2018/11/10(土) 22:29:10.53 .net]
- >>91
:
- 95 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/11(日) 00:38:12.80 .net]
- >>87
もしかしてtestと[]はだいたい同じですか? testを使わない方がいいのはなぜなんでしょうか?
- 96 名前:名無しさん@お腹いっぱい。 [2018/11/11(日) 19:15:20.55 .net]
- r2.upup.be/wV2qsULdHm
- 97 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/11(日) 23:47:57.65 .net]
- >>87
それで出てくるのは /usr/bin[ の方のmanじゃないだろうか
- 98 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/15(木) 14:21:20.04 .net]
- 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 `['.
- 99 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/21(水) 22:42:24.51 .net]
- sedで\1を変数名としていっぺんに異なる部分を異なる変数の内容で変換できませんか?
sed -e "s/<\(.*\)>/${\1}/g" こんなかんじの
- 100 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/29(木) 16:58:28.90 .net]
- #!/bin/bash
# 変数UR
- 101 名前:L, 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の引用符の扱われ方をググってみたりしても、何が何だかさっぱり分からない。 どなたか助けてくれませんか。 [] - [ここ壊れてます]
- 102 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/29(木) 18:06:56.14 .net]
- 自己レス
curlだからとか関係ないな。変数にシングルクォートで囲ったものが入ってて、それをダブルクォートで囲った配列展開してるんだから、そのパラメーターはそのままシングルクォートつきになって当然。 しかし、ETAGはダブルクオートを含むしhttpリクエストヘッダはスペースを含むから、全体をシングルクォートで囲まなきゃならんのだよな。 やっぱどのタイミングでどのクォートがどう展開されるのか、一段階ずつ追いかけてみるしかないのかな
- 103 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/29(木) 21:56:13.42 .net]
- なんか混乱しとるな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" だし、引数がゼロの場合は、書かなかったのと同じとなる("" 空文字にはならない) このように文字列として囲う機能じゃなくて、中に入ってる文字や変数の解釈の仕方に影響を与える機能
- 104 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/29(木) 22:00:40.89 .net]
- ちなみに "$@" を複数の引数に展開されたくなければ "$*" を使う
- 105 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/11/30(金) 06:16:21.18 .net]
- >>100-101
ありがとう。おかげで、サクッと片付きました。素直に OPT=('--header' "If-None-Match: ${ETAG}") curl "${OPT[@]}" "${URL}" で何の問題もなく動作しました。最初にcurlについて調べてたときにETAGを使う例でシングルクォートが使われてたのに、ずっと脳味噌が引っ張られてたようです。 上の行で変数に入れる時点で、スペースを含む一つの文字列として扱われてるんだから、あとはその中身がなんであるかに関係なく、"$[@]"で展開すればいいわけですね。 ありがとうございました。
- 106 名前:名無しさん@お腹いっぱい。 [2018/12/25(火) 18:37:21.02 .net]
- bashでログ出力処理を一括でやるにはどうすれば良いですか?
powesshellだと、Start-Transcript に対応するコマンドを教えてください
- 107 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/12/26(水) 01:04:
]
- [ここ壊れてます]
- 108 名前:21.34 .net mailto: >>103
何がしたいのかよくわからないが シェルスクリプト内の標準出力と標準エラー出力をファイルに出力するなら #!/bin/bash exec >script.log 2>&1 ... [] - [ここ壊れてます]
- 109 名前:名無しさん@お腹いっぱい。 [2018/12/26(水) 08:34:29.57 .net]
- >>104
何したいかよくわからんって、 パワーシェルでいうStart-Transcriptをやりたいの bashで一行ずつリダイレクトつけないとダメとかダサすぎる
- 110 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/12/26(水) 08:47:38.26 .net]
- 回答ちゃんと読め
- 111 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/12/26(水) 09:08:14.92 .net]
- PowerShellなんぞ興味が無いから知らんという人が多かろう
標準出力と標準エラー出力をファイルとコンソールの両方に出したいと言えばいい 知ってるがお前の態度が気に入らない(AA略)
- 112 名前:名無しさん@お腹いっぱい。 [2018/12/26(水) 18:22:57.16 .net]
- 生意気だな
- 113 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/12/26(水) 18:30:53.30 .net]
- ドザはどこ行ってもあれだな
- 114 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/12/26(水) 19:04:39.84 .net]
- ドザがー ドザがー
- 115 名前:名無しさん@お腹いっぱい。 [2019/01/10(木) 14:22:50.61 .net]
- やっつけ
$ { > echo foo > ECHO bar > } 2>&1 | tee result.txt foo ECHO: コマンドが見つかりません
- 116 名前:名無しさん@お腹いっぱい。 [2019/01/26(土) 23:47:05.51 .net]
- FreeBSD の /usr/bin/man で、
if { sizes=$($STTY size 0>&3 2>/dev/null); } 3>&1; then という記述があるんですが、これって何をしているんでしょう。 ・標準エラー出力を捨てている ・3 を 標準入力の指す先 (tty) に設定? ・0 を ↑の3に設定? 3>&1 して 1>&3 なら退避目的かなと思うんですが、これは違うので、 意図がわからないです。 ソースはここです。 https://github.com/freebsd/freebsd/blob/master/usr.bin/man/man.sh#L646
- 117 名前:名無しさん@お腹いっぱい。 mailto:sage [2019/01/28(月) 19:18:42.39 .net]
- ・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 と書けば十分なはず。
- 118 名前:名無しさん@お腹いっぱい。 [2019/01/29(火) 01:14:27.65 .net]
- findした結果を1行づつ配列に代入したい場合にはどうすればよいでしょうか?
当方が書いたshellだと、検索したい文字列に空白があるケースだと そこで要素が別れてしまいます。 array=$(find ${HOME}/animal -type d -iname "*検索したい文字列*")
- 119 名前:名無しさん@お腹いっぱい。 mailto:sage [2019/01/29(火) 12:56:34.68 .net]
- IFSを改行のみにする
- 120 名前:112 [2019/01/30(水) 08:38:21.70 .net]
- >>113
ありがとうございます! リダイレクトにstdin/stdoutの差し替え的な使い方があるとか、sttyはstdinを見るとか、sttyがstdinを見てもstdoutを見てもそれが端末を指しているなら同じこととか、数枚目からうろこが落ちました。 しかしそもそもsttyはデフォルトのstdin見ておけばいいんじゃね、とも思ったり。command |man 的な使い方ってあったっけなぁ。
- 121 名前:名無しさん@お腹いっぱい。 mailto:sage [2019/02/05(火) 14:26:11.34 .net]
- 少々スレ違いですがお許しください
OS 組み込みの tcsh をバージョンアップしたいのですが、 シェルスクリプトの挙動が変わってしまうのが怖くて、なるべく コンパイル時オプション(configure オプション)を揃えたいのですが バイナリしかない場合に、コンパイル時オプションを調べる方法ってないですかね? ## 例えば ISC BIND の -V オプションみたいな
|

|