シェルスクリプト総合 その37
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトに関する総合スレッドです。 全般 ・荒しは無視しましょう。 ・丁寧な姿勢を心掛けましょう。 ・ネチケット(死語)を意識しましょう。 ・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。 ・「POSIX原理主義」「ユニケージ」「USP研究所」はPOSIXとUnixを曲解し 間違ったシェルスクリプトを広めている宗教です。洗脳されないようにしてください。 前スレ: シェルスクリプト総合 その36 https://mevius.5ch.net/test/read.cgi/tech/1614212414/ 関連スレ ・【Bash】Windows Subsystem for Linux【WSL】11 https://mao.5ch.net/test/read.cgi/linux/1627507889/ ・Bashでプログラミング [転載禁止](c)2ch.net https://mao.5ch.net/test/read.cgi/linux/1443885102/ ・シェルスクリプト総合 その28 https://mevius.5ch.net/test/read.cgi/unix/1533154936/ ・zsh その7 https://mevius.5ch.net/test/read.cgi/unix/1337844883/ ・過去UNIXで使われていた ksh というシェルについて https://mevius.5ch.net/test/read.cgi/unix/1582358403/ ・【POSIX】UNIXプログラミング【BSD】 [転載禁止](c)2ch.net https://mevius.5ch.net/test/read.cgi/unix/1443103705/ ・おまえら! shell は何を使っているんですか? https://mevius.5ch.net/test/read.cgi/unix/1012330865/ >>229 メンバーに、Cshからの離脱を提案するべき!w >>232 まさにそれ >>229 そいつのオナニーをやめさせるべき cshスクリプトの中からbashを呼び出せば問題解決だよ! >>230 まさに20代の時にcsh多用してた 今じゃ csh ってまだあったの?という感じだが 40代だけど、Solarisでtcshがログインシェルだったなあ 作業手順書作って、承認受けてから変更作業するタイプのしごとしてて、 ワンライナースクリプトをcshrcに書いてた記憶がある。 帰ったらその頃の資料探してみる 独立したshell scriptを書くには向かないのは同意 Bsh系も、testコマンドのオプション扱いじゃなく、 直感的な == < > <= >= != を使いたいと思うことがある 普段他の言語を書いてて、たまにshを使おうとするといつも一瞬考えてしまう Bashだと = のかわりに == が使えるけど、後は駄目だもんな = もスペースのあるなしで代入と区別するなんてこと忘れてて悩むことしばし >>277 コマンドを使わずにシェルの文法を使えばいいだけ if ((0<10)); then echo ok fi >>236 使ってた本は 技術評論社のThe UNIX Surper Text 上 で、 第29章 csh プログラミング だと思う。 ほかはmanとwebの情報でやってたはず。 csh系はたとえシングルクォートの中でも!はエスケープしないといけないのが注意点かな。 変数の中に入れるときにエスケープはいつでも必須で、 それを使うときにヒストリ置換するならそのままつかい、ヒストリ置換せずに使うなら再度エスケープがいる。 あとは慣れだと思う。 リダイレクト関連はcshだと実現できないことがあったはずで、 それはcshからperl呼んで実質perlスクリプトになってたはず。 >>240 それで思い出したけどcshでシングルクォートだかダブルクォートだか 変数に入れることって出来る? 前に挑戦して挫折したことがあるんだが >>241 シングルクォートを入れたければ、ダブルクォートでくくる。 ダブルクォートを入れたければシングルクォートでくくる。 set hensu="single ' double "'"'" hogehoge" 古いbshもこの方式が必要だったはず。 あれ?できるね?なにで引っかかったんだっけか? 改行文字だったかな? 入れること自体はできるけど、それを使おうとすると Unmatchedが表示されない? 改行+クォートの場合だけ? どうも仕様がよくわからん 昔に何故cshでshell scriptを書くべきでないかという英語文書があって日本語訳もあった 調べたい人は自分で調べてくれ cshの問題点 > 4. クオート > csh ではまともにクオートをすることができません。 これか > 改行をクオートするためにはバックスラッシュを使う必要があり、文字列に含 > めるのは本当に難しいことです。 難しいのか不可能なのかはっきりしてほしいな 不可能なんじゃないのか? えー。うそー。そんなの簡単じゃん。 % set s = "abc\ def" % echo "$s" Unmatched ". ひでぶっ LFが入った変数を再度シェルに評価させるときは、 もともとその変数の末尾に¥¥を書く。 気をつけるのはヒストリ置換だけじゃなかったね 忘れてたよ。 alias time-filter '(perl -e '"'"'\\ use POSIX qq(strftime); \\ $| = 1; \\ while (defined(my $line = <>)) { \\ print strftime("%Y/%m/%d %H:%M:%S ", localtime), $line; }'"')" こんな感じ。 csh手元にないから動作確認してみて。 tail -f 時刻が出ない追記されていくファイル | time-filter って感じで使ってた 例の大学で教授やってるやつ、どうどう利用規約違反してたことを 宣言しててこいつやばくね?わかってないのかね? リッチー大佐の中の人 https://twitter.com/col_richie/status/1460830111939186689 > Twitter API v2は、収集可能なツイート数の制限が無料プランでも月200万ツイートに緩和される、 > とアナウンスされたのだが、我らのTwitterアプリ「小鳥男」なら、とっくの昔から、 > 理論上432万ツイートを1日で(1秒あたり50)収集する能力を持っているぞ。 https://twitter.com/5chan_nel (5ch newer account) 例えて言うのなら、 1ヶ月30GBまで使えるように緩和されます ↓ とっくの昔から理論上一日で30GB使い切るアプリを持っているぞ! 何を自慢しているのかわからないなw そんなのどんなアプリだって使い切る能力ぐらい持ってるでしょ 432万ツイートを収集できる能力のどこが「とっくの昔から能力を持ってるぞ」と 自慢するようなないようなのかわからん むしろ1秒あたり50ツイートって遅くね? 1ツイートあたり 280文字?として多めに見積もって1ツイート1KB つまり50KB/sでしょ? Twitter側の帯域制限があるのだろうと思うけど 別に自慢できる量じゃないなぁ そもそも通信速度とサーバーの負荷に依存する話なので たかがクライアントアプリを自慢するようなもんじゃない 全ての事をシェルスクリプトで実現可能だと信じる者にとっては、この世の全てはシェルスクリプトの話になる。 すみません、質問です。 hoge(関数) /usr/bin/python /usr/local/bin/piyo/piyopiyo.py mv foge fogefoge rm *hege*.csv exit hoge()[ python -B $1 以下、処理 ] という形は、 hoge(関数)というサブルーチン内で/usr/local/bin/piyo/piyopiyo.pyを実行する形になりますでしょうか。 お手数おかけして恐縮ですが、教えていただければ幸いです。 コマンド呼び出しは、 `〜`, $(〜) 〜の所に、/usr/bin/python /usr/local/bin/piyo/piyopiyo.py を書けばよい python で、スクリプトファイルを実行する リッチー大佐ヤケドしすぎててワロタw あの2人、終始レッテル貼りと揚げ足取りばっかりで終わってるな ガチでヌーブなんですけどrequestsとbeautifulsoupでスクレイピングやってます waitかけないとバンされるよと言われましたがどうすればいいですか? requests.get()でtimeoutは今書きましたがforで同じサイトの似たようなページに何度もアクセスするのでサーバーへの負荷はすごいと思います これに対してどうすればいいですか? シェルスクリプトの話題ではないので、他のスレへ書き込んでください! すみません、質問です。 cp -f dir1/file dir2 を実行し、もし失敗したとき、 echo File copy failure >> log を実行させる処理はどのようにすればよいですか? シェルスクリプト if文 でググると最初の方にあるのは、[ ] (test) ありきで、 評価するのは 条件式 と他の言語と同じような説明してるのなんだな 一定時間ごとにechoするスクリプトがあります プロセスっていうのでしょうか、 そのechoされたものを動的に取得し 別のスクリプトに渡したいのですがどうやればいいのでしょうか 【sample1.sh】 echo aaa sleep 3 echo bbb 【sample2.sh】 echo $1 $ bash sample1.sh & sleep 5 && bash sample2.sh このコードになんらかを加えてsample2にbbbを渡せたらな、 というのを期待しています 補足 >>271 実際はsample1.shの部分はサードパーティな他のスクリプトで そのプロセスが走ってる感じです 具体的にはbash sample1.shの部分は npm localtunnel --port 8010 です。 これが途中で your url is https:// ○○ みたいな表示が出てくるのですが そのhttps:// ○○をsample2.shで受け取りたいのです。 訂正 >>272 npmじゃなく npx localtunnel --port 8010 でした。 # コマンドの実行履歴を出力する set -x # コマンドの返り値が非ゼロのとき停止する set -e コマンド終了時には「終了ステータス (exit-status)」と呼ばれる、 コマンドの成否を表す数値が、特殊変数 $? に自動で設定される 各コマンドにより異なるが、一般的には、 コマンド成功時には「0」 失敗時には「1」(コマンドやエラーの種類によっては、0 以外) 何かのコマンド echo $? 例えば、 #!/bin/sh cat abc case $? in 0) echo "ファイルが存在する" ;; *) echo "ファイルが存在しない" ;; esac これを、if [ $? = 0 ]; then と書くと、Shell Check の警告が出る SC2181: Check exit code directly with e.g. 'if mycmd;', not indirectly with $?. >>271 プロセスの標準出力・エラーを、tee とかでファイルへリダイレクトして、 そのファイルを、tail とかで読み込めば? 単純に、パイプでつないでも出来るかな? 分からないけど >>275 おおそんな便利なコマンドがあったんですね $bash sample1.sh | tee result.txt & sleep 5 && bash sample2.sh でsample2内で取得できましたありがとうございます ゴテゴテですが一応やりたかったことはできました https://colab.research.google.com/drive/1nHbgd_KRiSF3uoaRKsM8shhMqFrI6PB0 for ((i=0; i < 10; i++)) { ... } 風 i=-1; while : $((i+=1)); [ $i -lt 10 ]; do ... done >>271 mkfifoで名前付きパイプを使ってもいいと思った 取りこぼしが無いよう、先にパイプを作る必要はあるが mkfifo pipe sample2.sh < pipe & sample.sh > pipe & fg %- みたいな sample2の引数にsample1を取って中で実行させるんじゃ駄目なの? >>279 終わった話に、あやしいやりかたの提案。w >>274 無駄な書き方だからでは? 警告通りに if mycmd ... の形式を使うわけには行かないのか? >>271 expect コマンドを使うと複雑な事も出来ると思う。 >>274 普通はファイルが存在するならコマンドを実行する、と書くし、非存在時のechoコマンドの 出力先が標準出力な点も気になる(標準エラー出力であるべき)。また、catコマンド実行時に ファイルが見つからなければ、"そのようなファイルやディレクトリはありません"とコマンド 自体が(標準エラー出力に)メッセージを出すので、重複した記述でもある。 > 普通はファイルが存在するならコマンドを実行する、と書くし、 書かねーよ。 ファイルが存在すると判断した後の消されたどうすんだ シェルスクリプト業界って素人が多いのか? ファイルが存在すると判断した後に消されたどうすんだ シェルスクリプト業界だろ?w シェルスクリプトばーっかりやってる シェルスクリプト最強って言ってるアホ会社ども >>284 どうせエラーになるから、問題ないやろ。 まあ、「業界」wではありがち。 どうせエラー出て失敗するんだからやり直せばいいだけのことなのに あらゆる可能性を想定して滅多に使われない機能まで組み込んで肥大化する方があるある 問題点に対するソリューションのご提案。 ・ファイルロックを取得してから操作します。 ・ファイルロックを取得できなかった場合、 1.他のプロセスが既に取得している。 2.ファイルが存在しない。 ・以上を確認します。 >>288 > 普通はファイルが存在するならコマンドを実行する、と書くし、 これがだめなやり方だって話をシてるんだが理解してる? テキストの入力、加工、出力以外の処理を無理に書くべきじゃない それ以上のことがやりたくなったら別の言語使った方が楽 シェルスクリプトでcpやrmを実行するなとか言ってんの? アホじゃね? お前シェルスクリプトの使い方を間違ってるよ むしろテキストの加工ならなんの言語でやってもいい どこの会社でもやたら批判的な発言をするものの具体的な答えは何も示さず 相手が何を言い返しても分かった風の立場で「それは違う」と上から目線で言い続けるだけのマシーンっているよね 一言目から答え出しておけば無駄な会話もなくなるのに 変な会社に勤めてるんだな 自分の特殊な環境なのに全体にするとか ネットによく居るタイプだな cpもmvも処理の途中でやるもんじゃないよ。出力とみなして最後にやりなよ ファイルをロックしてまで、やっているスクリプトは珍しい 普通は、ファイルが存在しなければ、そこでエラーになるだけ シェルスクリプトには真のファイルロックなんてない ロックファイルを作ってごまかしてるだけ だからその状態で電源OFFとかエラーで強制終了すると 中途半端にファイルが残ってトラブルになる そもそもファイルをロックするなんて出た時点で シェルスクリプトを使うのは間違ってる データベースを使えばいい >>304 しょせんアドバイザリやろ? たいして役にたたん。 >>306 オタク同士のなれ合いみたいなモノで、 DQNですらない陽キャ相手に崩壊するレベルだよ? name=value : $(($name = 123)) echo $value これってPOSIX準拠? bc使わないで小数の比較演算ってできますか? RHEL8.0環境で何もインストールしてはいけません縛りの環境を渡されてbc入ってなくて詰んでます。 PerlかPythonははいってんじゃないの? dnf(yum)用とかで。 確かに pythonで計算することにします ありがとうございました >>311 何もインストールできないせいで、生産性が下がっていますって 言わないとあとで苦労する 生産性が下がっている原因を、くだらない決まりを作ったやつに押し付けろ >>313 何そのレス >>2 にあるURLのこ見やがれ プログラミング言語を使わずに計算することを考える時点で、既におかしい >>316 >>2 のURLのどこにも書いてないから言ってるんだよ >>317 言えるやろw まさか「書いてる」という言質が欲しかったわけじゃないよな 言葉使いからは「いつもの」っぽいけど 書いてると言われても見つけられなさそうだな、パターン的には >>318 「比較」やそうやから、「計算」やないんでセーフ。 値とかバージョンとかの比較は、シェルスクリプトでもしたいことはあるやろ。 と書いて、ひとつ思い出した。 >>311 sort --sort numericでいいんでは。 いや、そう使うように書くのはなかなか面倒か。 できなくはないやろけど。w Linuxは一貫としてbcはデフォでは入ってないんだな。なんでだろ LinuxというかGNUがだろけど POSIXとの互換性、仮にGNU bcでPOSIXのがそのまま動くとしても互換動作モードやドキュメントを書くのが面倒 とかかなと思ったら、 -w, --warn POSIX bc に対する拡張機能が入力された場合は警告を出します。 -s, --standard POSIX bc の言語仕様に厳密に従って処理します。 きっちりあるやん。なんでだろ。ナゾい なんか、予告的なアンカーだなw 書いてませんでした と言えるのがイミフ。凄すぎてわからん ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる