シェルスクリプト質問スレ
標準出力の速度を制限したり、通信速度を表示するコマンドってありますか? 標準入力をreadして変数に溜め、望みの時間sleepして標準出力にechoするだけのwhileループじゃん テキスト行の末尾に改行があればそのまま、なければ改行を追加、みたいなフィルタはどう書くのが簡単? sed -z ...でできるんだけど、実はもっとあっさり!だったりしないかな。 $ cat sample.txt (snip) This line is end of file.[EOF] を $ cat sample.txt (snip) This line is end of file. [EOF] にしたいってことじゃね? cat aaa | awk '1' これなら、sedよりあっさり? とは言えないか。 行末に改行があろうがなかろうが改行文字(\n)を削除してから 行末文字($)を改行文字(\n)で置き換える(行末に改行文字を追記する) cat sample.txt | tr --delete '\n' | sed 's/$/\n/' インタラクティブにシステムコール呼べたら楽かなと思ってbashのヒアストリングをgccに食わせたんだけど gcc -o ${blob} <<ccode \#include <...> ... ${fun}(${argv}) ccode ld:/dev/fd/nn見つからないよ collect2: ld returned 1 gccがldを非同期実行し、fdが回収された後にもldが動いてるのかと思い (gcc ... & 1s)のように遅らせてもダメな謎 とりあえずmktempで動きはするけど、中間ファイル要らないクリーンなやり方ないかな 大体こんな雰囲気 code=$(mktemp --suffix \.c) blob=… (include/漁って型取得、引数成形) IFS=, declare argv="$*" cat <<c >|${code} \#include <...> ... ${fun}(${argv}) ... c gcc ${code} -o ${blob} rm -rf ... 単にgccが標準入力をソースコード扱いしたりはしないってだけでは /usr/lib/gcc/中略/cc1なら標準入力を取るけどこのパスの特定は面倒だし、素直に中間ファイル作ったほうが良さげでは perlとかpythonで済むならそっちでも >>52 ファイル作ると監視システムに見つかるから、 それを避けたいって話じゃないの? >>49 「行末に改行があろうがなかろうが」 すまん意味がわからん。 テキストファイルはCRLFかLFの改行コードを入れて 初めて行末になるもんだと思ってたが、 それ以外の行末もあんの? ファイル末尾と言いたかったんじゃないの。 >>45 はバグった仕様書を書くとタイプ。>>49 は腐った仕様書に疑いを挟まずコーディングするタイプ。 >>52 返信遅くなってごめん 進捗 プロトタイプはマクロだらけの生ヘッダよりman 2/3から抽出してテキストに纏めると楽にできた 手間は掛かったけどシェルから色々実験できて楽しい、見返りはあった 特定の変数に入れて返されるエラーコードはハードコードして拾うしか無さそうだけど、そこまではいいかな… フロントエンドのgccでなく直接cc等呼ぶのも試してみる、ありがとう >>53 個人PC上での個人的な便利ツールなのでそこまで考えてないです たまにrm失敗するので何らかのデーモンが見に来てるとは思いますが、呼ぶたびに前回のtmpをsuffixで識別&一掃してます… あるフォルダが存在するか否かによって分岐させたく if [ -d ./$DIR]; then hogehoge という形でスクリプトを書いているのですが 現状~/shell_scriptにパスを通してここにそのスクリプトを置いて実行しているので~/shell_scriptに$DIRが存在するかで判定されてしまいます これをなんとか実行するディレクトリでフォルダの有無を確認するようにしたいのですが何かいい方法はないでしょうか ./$DIRで既にカレントディレクトリからの相対のはずなので、どこかでcdしていなければ スクリプトの置き場所が影響するなんてないはずだけど わざわざ ~/shell_script に移動してから実行とかしてない? 即レスありがとうございます 純粋にフォルダの指定方法が間違っていただけでした ありがとうございます 環境変数指定のコマンドラインについて質問。 ENV=VALUE cmdline1 ENV=VALUE cmdline2 これをまとめたくて、次のようにするとエラー。 ENV=VALUE ( cmdline1 ; cmdline2 ) しかたがないので、次のようにしてます。 ENV=VALUE bash -c 'cmdline1 ; cmdline2' なんかわかりにくいし、コマンドラインのクォートが面倒でもあるし、イヤな感じ。 もっときれいな書きかたはありませんか? ( ENV=VALUE; cmdline1; cmdline2 ) >>64 たしかに。w そう書いたときもあったのに、なぜかなんか別物あつかいでした。 ありがとう。 #!/bin/sh -xってやると評価結果とかが色々表示されるけど、 スクリプトの中で別のスクリプト呼んでるような時に その呼ばれたスクリプトも含めて色々表示させる方法ってありますか そのスクリプトにいちいち-x付けてると面倒だし消し忘れとかもあるかなと /bin/shを、/bin/sh -xして動かすようなものにしてみたけど 全てのシェルスクリプトの動作が変わり、OSがおかしくなって後悔した 簡単な方法は思いつかないけど… MY_DEBUG みたいな適当な環境変数でも使って、呼ばれるスクリプトの冒頭で if [[ -n MY_DEBUG ]]; then set -x; fi みたいにするとか。 なんでそんなにデバッグコードを仕込みたくないのか分からんが、どうしてもと言うなら sed -f inject_debug_cmd.sed production_code.sh | sh -s ファイル全部-xデバッグはちょっとアウトプット多すぎて辛いと思うけど 変な動きしてるブロックを囲んで、単語分割が予想通りかくらいしか確かめるくらい まあそこが一番のハマりどころだから重宝するが 最終的に残らなければいいだけなら、デバッグコードの行末にでも#dbgみたいなタグ付けといて、edでインプレースに消せばいいと思うけど ソースツリー全体のシバンを消し忘れたくないだけならfind -name \*.shとかで列挙してデストロイ >>66 > /bin/shを、/bin/sh -xして動かすようなものにしてみたけど そういう方向なら、もうちょっと凝って、呼び出し側のパスや特定の環境変数を見て切り替わるようにすればいいんでは。 無差別にやるから、init.rcとかで壊れるんやろ。 Bashのsourceコマンドについて確認。 source内では、その呼び出し側で設定していたset -eとか-uは無効? source対象は、呼び出し側で実行されるんだから、それ以前のsetオプションは有効のままだと思ってたけど、実際にはそうではなかったみたいなので。 確認( ー`дー´)キリッ ソース読めよsourceだろ? >>66 仮にシェルスクリプトの中でzcatコマンド使っているとして そのzcatコマンドがシェルスクリプトだったらどうすんの? zcatコマンドもデバッグログ出ても問題ないんか? >>75 後悔したあとに 何をしたいと言ってるのか よく考えてみよう >>76 ○○なのか。後悔しない別の方法を探しているのだろう。 だから後悔しない別の方法を探してるやつに 教えてやってんだろ >>77 後悔しない別の方法がこれか。 > デバッグログ出ても問題ないんか? 数時間前の自身の発言すら記憶にないわけか。本物だな。 ヤバイwこいつマジで日本語わかってないw ワクチン打ちたくないって言ってる人に コロナで死んでも問題ないんか?って言ったら コロナで死ぬこと=後悔しないことだと思っちゃう人か >>80 アホくさ。さらしage >>66 (質問者) > /bin/shを、/bin/sh -xして動かすようなものにしてみたけど > 全てのシェルスクリプトの動作が変わり、OSがおかしくなって後悔した >>74 (オマエ) > 仮にシェルスクリプトの中でzcatコマンド使っているとして > そのzcatコマンドがシェルスクリプトだったらどうすんの? > zcatコマンドもデバッグログ出ても問題ないんか? >>81 そこは質問じゃねーだろ アホなのはお前だよ >>66 (質問者) > #!/bin/sh -xってやると評価結果とかが色々表示されるけど、 > スクリプトの中で別のスクリプト呼んでるような時に > その呼ばれたスクリプトも含めて色々表示させる方法ってありますか ↓こっちは質問じゃなくて経緯 > /bin/shを、/bin/sh -xして動かすようなものにしてみたけど > 全てのシェルスクリプトの動作が変わり、OSがおかしくなって後悔した 後悔したから、それ以外の方法で > スクリプトの中で別のスクリプト呼んでるような時に > その呼ばれたスクリプトも含めて色々表示させる方法ってありますか って聞いてんだよ 日本語勉強しな >>82 何が、そこは質問じゃねーだよ。 つまり、質問を全文読まなかったため、質問者の後悔した事とほぼ同内容のレスを、当の質問者に返してしまったというオチか。 なんだか言い訳すればするほど語るに落ちるやつだな。 ああ、「質問者の後悔した事とほぼ同内容のレス」だと思ってんのか これこそ語るに落ちるだな 質問者は/bin/shを/bin/sh -x に変えたからだめだと思ってんだよ だから「後悔した後に」特定のスクリプト以下なら大丈夫だろうと思って質問してるんだろ だからそれじゃだめだよってzcatの実例を出してるんだろ まったく本当に理解力がないやつだな そこまで大規模な調査をするのなら、神ツール・strace でも使えば? バグの場所を突き止めることは、同じ >>85 どんどん落ちるね。 > 全てのシェルスクリプトの動作が変わり、OSがおかしくなって後悔した と、想定外のスクリプトへの影響を悔いているところに、想定外のzcatスクリプトもありまっせなんてのは言わずもがな。 質問者の後悔を再提示しているだけだよ。お前の中では懸隔しているとしてもね。 >>88 この2行も読めないの? > だから「後悔した後に」特定のスクリプト以下なら大丈夫だろうと思って質問してるんだろ > だからそれじゃだめだよってzcatの実例を出してるんだろ 質問者が後悔したあとに またやろうとしてるんだから 再提示するのは当たり前やろw zcatの問題に気づいてないんだから >>89 また落ちた。それはお前の空想。 質問者は > またやろうとして いない。「色々表示させる方法」を尋ねている。表示させる方法イコールsh -xはお前の短絡思考。 まぁ想定外スクリプトも、質問者は言及済みであり、余人には言うまでもない当然の事でバカバカしい限りだが、お前の中では蒸し返す必要のある重要事だったんだろう。 無用の親切だが、親切であるのは悪いことではない。 > 表示させる方法イコールsh -xはお前の短絡思考。 表示させる方法イコールsh -xなんて 一言も書いてないんだが それこそお前の短絡思考じゃんw > まぁ想定外スクリプトも、質問者は言及済みであり どこにも言及されてない set -x export SHELLOPTS じゃだめなん? WLANのデバイス名を環境変数に入れたいんだけど、どうすればいい? ifconfigかiwconfigの出力をawkで加工して環境変数にセット yumで、パッケージ内の特定ファイルだけをインストールする方法はある? パッケージファイルをダウンロードしてからrpmコマンドで特定ファイルを抽出したらいいんだけど、もっとあっさりしたやりかたはないんかなー、と。 パッケージにもいろいろあるからな。 スクリプトつめあわせみたいなのから、いくつかだけ選ぶことはあってもよさそう。 ディスク容量の節約でもしたいってこと? それならalpineとか使うべきだろう おまえはそうしたいならそうしろ。 需要の有無ならある、て話。 なんのためにそうしたいのか聞いただけでこの反応w やることが目的になってんのな なにがどうシェルスクリプトに関連するのか全然わからん <main> <sub_aaa id=A> <sub_bbb> </sub_bbb> </sub_aaa> <sub_aaa id=B> <sub_ccc> </sub_ccc> </sub_aaa> </main> を A.xml B.xml <main> <main> <sub_aaa id=A> <sub_aaa id=B> <sub_bbb> <sub_ccc> </sub_bbb> </sub_ccc> </sub_aaa> </sub_aaa> </main> </main> と言った感じで<sub_aaa>タグ毎にファイル出力する方法教えてください。 すみません スペースで埋めたところがスペース1個文しかインデントできてなくて見にくくてすみません。 シェルスクリプトって文字列を""で囲まなくてもいいんですか? >>104 cat ab.xml | sed -n '/<sub_aaa/,/<\/sub_aaa/'p | awk -F[=\>] '/<sub_aaa/{OUT=$2}{print $0 >> OUT".xml"}' シェルスクリプトで教えてください ファイル中の文字について、以下のような置換をしたいです 前 後 a →X b →U c →E d →P ::: y →A z →M 前と後は1:1なのですが、変換後の並びは不規則です sed -e 's/a/X/g' -e 's/b/U/g' 〜〜〜 とaからzまで並べることで 一応置換はできるのですが、長大な行となってしまっており、 どうにかならないかと思ってます >>109 cat filename | tr [a-z] [XUEP〜AM] というのはどうだろう mvを常にmv -iで実行するようにしたいのですがどうすればいいですか >112 "常に"がどういう意味かによる ターミナルから自分の手でmvするとき常になのか、自分のユーザー名でmvするとき常になのか、全てのユーザーがmvするとき常になのか たぶん下記のようにすればいいんだろうけどなにか副作用があるかもしれない $ cat ~/.bashrc mv() { command -p mv -i "$@"; } #or mv() { /usr/bin/mv -i "$@"; } $ cat ~/bin/mv #!/bin/sh /usr/bin/mv -i "$@" $ cat /usr/local/bin/mv #!/bin/sh /usr/bin/mv -i "$@" ありがとうございます なるほど、あまり影響が大きいのは怖いですね、一番上がよさそうですね 強制的にリネームするときはmv -fとやるという運用を考えています コマンドラインより与えられ、$1や$2等に入れられたオプションを 以下のように表示したいと思ってます ./aaa.sh a bb ccc $1=a $2=bb $3=ccc 以下のようなスクリプトで「$n=」まではできたのですが、その後のxxxxにあたる、 位置パラメータを示す$と、変数iを組み合わせてできた「$1」を 更に評価した結果である「a」や「bb」を得る方法が分かりません #!/bin/bash for i in `seq 1 $#`; do echo "\$${i}=xxxx" done どのようにすればよいか教えてください >115 やりたいことを実現するだけなら、難しく考えずに最初の引数を表示したらshiftすればいいと思う for i in $(seq 1 $#) do echo "\$$((i))=\"${1}\"" shift done >>115 オプションの概念がないのか? 引数の順番だけで判断すると、複雑なものになって想定外の使われ方、使い方をしてしまう #/bin/sh for i in `seq 1 $#`; do eval echo \\\$$i=\$${i} done ラズパイOSの起動時にシェルが自動で動くよう試しています 打ち込みでシェルの内容が動くことは確認できるのですが、cronやsystemd では、思うように動きません。シェルの内容がおかしいのでしょうか #!/bin/sh cd /home/dtt/google-home-player/ nohup lt -s modulenotfound -p 3000 >/dev/null 2>&1 & nohup /usr/local/bin/node server_for_line.js >/dev/null 2>&1 & nohupコマンドを使っているが、フォアグラウンドとバックグラウンドもわかってないのかな? >>121 hpのコピペなんで。systemdとforeverで分けて read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる