シェルスクリプト総合 その28
レス数が1000を超えています。これ以上書き込みはできません。
シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
前スレ: シェルスクリプト総合 その27(https://mevius.5ch.net/test/read.cgi/unix/1525337663/) お約束
・特記なき場合、Bourne ShellもしくはPOSIX準拠のsh可換シェルが既定です
つまりシバンは#! /bin/shです。
他のシェル(bash, zsh, ksh, (d)ash, yash, posh, fish, (t)csh)などの専用機能に依存する場合は明示しましょう。
OS X, GNU/Linuxユーザーは/bin/shの実体がbashなので*特に*注意(自覚なきbashism---シバンが#!/bin/shなのにbashに依存する構文を使っていませんか?)。
ただしDebian, Ubuntuなどでは/bin/shの実体はPOSIX sh互換のdashですのであまり気にしないでも大丈夫です。
FreeBSDユーザーは/bin/shの実体がashなので注意。
Solaris, OpenBSDユーザーは/bin/shの実体がkshなので注意。
csh/tcshでのシェルスクリプトは*まったく推奨しません*。
(参考URL: http://www.speech-lab.org/~hiroki/csh-whynot.euc)
・POSIXに準拠しましょう
有用なリンクはhttps://en.wikipedia.org/wiki/POSIXにまとめられています。
最新の仕様はこちらへ: http://pubs.opengroup.org/onlinepubs/9699919799/
(左上の「Shell & Utilities」から各コマンドやファイルの仕様を参照することができます)
・Version 7 UNIXのsh(1)に一番近いのはOpenSolaris由来のHeirloom sh、次点でDebianなどに搭載されているDash shell
Heirloom sh: http://heirloom.sourceforge.net/sh.html
Dash shell: http://gondor.apana.org.au/~herbert/dash/
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります
Manページや各種リンク(http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.htmlなど)を見ましょう。
apropos(1)ないしはman(1)の-kオプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな 初心者へのアドバイス
・適した道具を判断するのも頭の重要な使い方。
シェルスクリプトよりもPerlまたはPythonの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらman(1)を引きましょう。
・思い通りに動かないときは、まずはsh(1)の-xオプションでトレースしましょう。
回答者への注意事項
・相手がシェルスクリプトでの処理方法を質問しているのにもかかわらず、よく知りもせずに、「そういうのはPerl, Python使え」と回答するのはやめましょう。
安易にPerlやPythonに逃げずに小さなコマンドを組み合わせシェルスクリプトで処理するのが頭のいいやり方。
・質問に対して問題が間違ってるといちゃもんをつけるのも避けましょう。 補足(今スレ限り)
いままではUNIX板でスレ立てをしていましたが、IDやワッチョイが無いことを理由とした自演・荒しが目立ってきておりスレがまともに機能しなくなりかけているので、今回よりプログラム板に移動することになりました。 テンプレの↓
> 自覚なきbashism---シバンが#!/bin/shなのにbashに依存する構文を使っていませんか?
ちょっと痛いかな bashのあれやこれは、shでどうかけばいいかってのがあるといいな
特に配列。配列は引数として処理するんだよっていうのが体系的にまとまるといいな 本来の引数配列以外で配列が必要になったら、基本的にはawkその他の言語使うなあ。
まあ自分用だと気の迷いで引数配列転用したり、evalで頑張ったりすることもあるけど、
仕事で他の人に引き継ぐこと考えると保守性で問題になるので
仕事ではやらないようにしてる。 >>16
配列が必要になるっていうのは、シェルスクリプトの
プログラミングの仕方が間違えてるってことだよ
例えて言うならば、関数型言語をオブジェクト指向言語的に
使って、オブジェクト使いたい。インスタンス作りたい
メソッド作りたい、継承、カプセル化欲しい!って言うようなもん
シェルスクリプトは引数または標準入力で渡されたものを
順次処理していくという書き方をするもんなんだろう。
一時的に変数にためておくなんてことはしないので
配列は使わないですむ evalだけは怖いから使わない
それでしか解決できない問題をまだ扱った事がないからだが evalは信頼できない文字をevalするのが問題なのであって
コードの中で作り出した文字をevalするなら問題もないんだよ
信頼できない文字であっても、使える文字種を限定すればいいし >>17
だいたい同感。
配列や連想配列がぴったりした応用もあるんだけど、
シェルで書くようなプログラムじゃないね。 あるリモートファイルの最新のバージョンをダウンロードする方法ってありますか。
具体的にはhttp://ftp.jaist.ac.jp/pub/GNU/gnuzilla/←ここの最新バージョンのディレクトリを知りたいです。 >>17
バッチファイル程度のシェルスクリプトしか
知らないからそう思うんでしょ
知れば奥が深いよ
配列も結構多くのシェルがサポートしてる(例えばcsh) 極端な例を挙げるなら、行列演算をシェルスクリプトで書く馬鹿はいないみたいな話よ。
配列に限った話ではなく、ほとんど全ての高級言語にあるのにシェルにはない言語機能がいろいろある。
例えば構造体に類する機能とか、参照とか。
言語には向き不向きがあって、シェルでは向いてない用途に無理矢理使うのは井の中の蛙。 >>21
wget -qO - 'http://ftp.jaist.ac.jp/pub/GNU/gnuzilla/?C=M;O=D' | grep -m1 -Po '\[DIR\].+?href="\K[0-9.]+' >>25
ありがとうございます。
上手くいきました。 できるだけ可搬なUNIX時間<->ISO 8601形式時間の変換器ってどんなのがありますかね
PerlやRubyでいけるのは知っていますが,もうちょっとPOSIXに従ってるやり方が知りたいです >>28
GNU date 限定の技だと思うのであまり嬉しくないかもしれないけど、以下のコマンドでいけるそうだ。
date --date "@1501201492" +"%Y%m%dT%H%M%SZ"
ちなみに出典は以下の記事です。
dateコマンドを使ってUnixTimeをISO8601形式へ変換する - Qiita
https://qiita.com/EDAPIYO/items/1bf163604006fd667988 >>28
小出しでスマン。こういうオプションもあるみたいなんだけど、man に記載されてないね……
$ date --date "@1501201492" --iso-8601=seconds
2017-07-28T09:24:52+0900 >>29
ありがとうございます。
そうっすね……。dateコマンドでできるのは知っていますが,
これ,ものっすごく可搬性悪いんですよ。下手するとPerlでやったほうがマシなくらい。
なぜかというと,各種OSによってdateコマンドのUNIX時間<->ISO 8601形式時間変換のオプションが違うんです。
*BSDはdate -jだしGNU/Linuxでは書いてもらったdate --dateとかdate -dとか。
ある種のOSではdate -rもあるっぽいです……。 >>31
BSD一般は date -r 数字 では?
最近の NetBSD だと date -d @数字 とも書けるから GNU と共通にできる。 >>28
アルゴリズムとしては
秒数→日時変換と日時の足し算だけなんだから
自力で作れない? 自力で作るならコマンド見分けたほうが楽だなw
どちらも同じオプションだけど意味が違うものを使って見分ける >>31
自分で言ってる様に Perl で書いちゃえば良いような… 自分で足し算すると、サマータイム・うるう秒は、大丈夫なのか? bashです。
aa.shからbb.shを呼び出した時、リダイレクトでログを残したいんだけどうまく行かない。
なにか間違っているでしょうか?
(aa.sh)
#!/bin/bash
b_shell="./bb.sh"
cmd="${b_shell} > ./bb.log"
${cmd}
(bb.sh)
#!/bin/bash
echo "hoge" bb.sh で
echo "$*"
してみりゃ、理解できるだろう >>36
確かそういうのを考慮してないんじゃないの? >>45
うるう秒はUNIX Epochからの秒数には入ってないので無視して良い。
サマータイムやタイムゾーンの考慮は必要だしとても大変。
日本のタイムゾーン固定ならサマータイムも今のところ無視できるし簡単だけど、perlでも使ってライブラリに任せた方がいいと思う。 >>47
この板のIDは8桁だから9桁目(いわゆる末尾)はないよ 昨日発見した事なんだけど、シェルというよりは test コマンドの問題だけど、test -f で対象のファイルを指定しない時って0になるのな。
これはbash用に書かれたこんな記述の時の動作によって気づいた。
if [ ! -f $file ]; then
echo ファイルなし
exit 1
fi
これで file に何も代入されてないとか空文字列の時にファイルなしにならない。
なんだこの動作は?
testコマンドの仕様?たまたま俺の使ってたLinuxのtestコマンドのバグ?
まあbashなら[[ ]] 使っとけばエラーになるからそっち使っておけば良いんだけどね。 find [xxx] -type f | xargs grep [yyy]
をよく使うので
search xxx yyy みたいな alias にしたいんですけど
引数を途中に挟むのってどうすればいいんでしょうか >>50
そ、そうか。
しかしなんでまたそんな仕様になったんだ? >>51
bash の場合は function で定義するしかないようだよ。ググって探してみな。 >>53
functionでできました
ありがとうございました >>52
ググって探してみなw
まあ、何らかの歴史的な背景だろうけど、明確に仕様に書いてあるのだから >>51は grep -r [yyy] [xxx] もしくは rgrep [yyy] [xxx] でいいんじゃねーの?
俺はagの方をよく使うが >>49
そもそも if [ ! -f $file ]; then だと $fileにスペース等が入っている時に
対応できないので "$file" と書くのは必須
更に言うなら set -u すればいい。$file が空のときはエラーになる 0 arguments:
Exit false (1).
1 argument:
Exit true (0) if $1 is not null; otherwise, exit false.
って、だけなんだけどな。2 arguments から本格的に判定に入るってとこかな。演算子が有効なものなのかも含めて ああ、1 argumentの場合は空文字列でないかどうかっていうテストになるのか。そう思えば不思議でも何でもないな。使わないけどw
歴史的にそんなのがあっても不思議ではないな、実際どうなのか知らんけど # set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
これは、~/.bashrc だけど、
変数中に空白があっても良いように、たいてい変数は" " で囲む。
一方、固定値は囲まない
こういうように、シェルスクリプトには様々な引掛けあるから、危険!
Ruby などのプログラミング言語を勧める
マンガの「Linux シス管系女子3」に書いてあるけど、
「rm -f $file」と変数を" " で囲わなかったので、
「; rm -rf shared」というファイルがあったため、
rm -f ; rm -rf shared
と文がつながって、共有フォルダのファイルがすべて消えてしまったとかw >>60
変数の値として ; が入ってても、文の区切り扱いにはならないので嘘くさい。
evalしてれば話は別だが。 だから、ディレクトリパス・ユーザー名とか、
システムで使うものに、半角空白を入れたら、ダメ
シェルスクリプトを書いている奴が、変数を" " で囲んでいないと、バグるから
パスに半角空白を入れないようにって、
Mac ユーザーにも、よく言われる
Windows には、半角空白が入ったフォルダ名があるから、危険 >60 は、
日経Linux で連載している、Piro の有名なマンガ、
「Linux シス管系女子3」に書いてある
このマンガを知らなかったら、もぐりw >>62
> Mac ユーザーにも、よく言われる
ほんとかよ。macOSの標準ディレクトリに普通にスペース入っているのあるけど
うそくさい、えせくさいw 実際に試してみればええんじゃないの
$ mkdir shared
$ touch '; rm -rf'
$ ls
'; rm -rf shared' shared/
$ for file in *;do rm -f $file; done
$ ls
'; rm -rf shared'
$ mkdir shared
$ ls
'; rm -rf shared' shared/
$ for file in *;do rm -f "$file"; done
rm: cannot remove 'shared': Is a directory
$ ls
shared/ >>60
>一方、固定値は囲まない
囲まなくていいのは囲まないだな。当然囲む必要があるのなら囲む " でなく ' ででも
囲まないで ¥ 使う物好きもいるかもしれないが
変数でも囲まないのは同じように囲まなくてもっていうところが原点だろうが、世の中そんな条件付けが許されるほどそう甘くはないっていう
その下の rm はイミフだな。>>61のほぼ言う通り。もちょっと「なんか」あるんじゃないの
そんなマンガ知らなかったらモグリよばわりされるならモグリで十分すぎるw 日経Linux は、Ruby の作者・Matz と、マンガの「シス管系女子」の連載が有名
「シス管系女子」も、もう3冊目。
たいてい本屋の目立つ所に置いてある
システム管理者の必須本 >>67
それ以上システム管理者とやらを貶めるなよw >>60
> 変数中に空白があっても良いように、たいてい変数は" " で囲む。
> 一方、固定値は囲まない
固定値だから囲まないんじゃなくて、
固定値かつ、空白が含まれてないから囲ってないだけ
固定値でも、空白が含まれていれば囲む >>62
> Windows には、半角空白が入ったフォルダ名があるから、危険
危険なんじゃなくて、半角空白が入ったフォルダがあるから
きちんと対応せざるを得なくなってバグが減る
下手に半角空白がないシステムばかり使っていたら
半角空白に対応するのを忘れてしまう。そっちのほうが危険。
そんなことよりもshellcheckでチェックするほうが常識
これを知らないやつはモーグリ >>60
> こういうように、シェルスクリプトには様々な引掛けあるから、危険!
> Ruby などのプログラミング言語を勧める
Rubyは外部コマンドを呼び出すのがすごく面倒くさい言語だが
参考 https://qiita.com/zakuroishikuro/items/3ab4476ff53f50a163be
> _人人人人人人_
> > めんどい <
>  ̄Y^Y^Y^Y^Y ̄
``を使えば、最小2文字の追加で呼び出すことができる
(正確にはputsしないと標準出力は表示されないからスペース入れて7文字)
Rubyでも結局同じ問題が起きる
# ruby −e Vdir=Wa bW; `ls −al #{dir}`V
ls: cannot access VaV: No such file or directory
ls: cannot access VbV: No such file or directory
(全角なのは書き込みエラーが出たから。もう面倒だから一律変換する)
回避策はいちいち言わなくていい、そんなのあるの知ってる。
Rubyでも様々な引掛けがあるという話。 Ruby使うくらいならPython使うわ。
でもここはシェルスクリプトのスレなんですよ。
しかも「ダブルクォートで囲む」という至極単純な対策でバグを回避できるんだから
他の言語を使う必要もないな。
ところでファイル名にダブルクォートが入っている場合があるので
ダブルクォートで囲む前にsed -e 's/"/\\&/g' とやる必要がある。 >>73
> ところでファイル名にダブルクォートが入っている場合があるので
なんのことでしょう?
ファイル名にダブルクォートが入っていても
なんの問題もないですよね?
[test.sh]
#!/bin/sh
n="a'\"b"
file "$n"
$ echo test > a\'\"b
$ ./test.sh
a'"b: ASCII text bashでは0(真)か0以外(偽)となりますが、
Cスタイルのforループの条件判定のところにi==0( i>=0とするところを間違えてやってしまいました)
とやったら一回もループに入らなかったのですが、
Cスタイルのforループの中では0は偽なのでしょうか?
forループは下のループです。(chinachu-mirakurun-sleep scriptでスキップした番組の時に録画動作に入らない
ように改造したものです)
for ((i = ((${#IsSkipArray[@]} -1)) ; i>=0 ; i--)); do
if [ "${IsSkipArray[i]}" = "false" ]; then
(( RecTime = ${RecTimeMsec[i]} / 1000 ))
elif [ "${IsSkipArray[i]}" = "true" ]; then
:
fi
done ちょっと訂正します。
間違えたコードはi==0ではなく、条件式にi=0としていました。
だから毎回判定するごとにiに0が代入されてループに入れなかったんですが、
お聞きしたかったのは0が偽だからループに入れなかったのか?ということでした。
条件式に代入式を持ってくる時点で素人丸出しなんですが、どうかご容赦ください。 ttps://mywiki.wooledge.org/ArithmeticExpression
ここのサイトを見たらfor (( ; ; ))もArithemetic Expression(算術式)で、
However, when evaluating an arithmetic expression, C language rules (0 is false, anything else is true) apply.
と書いてありました。Cの原則が適用されるようですね。自己解決したっぽいです。
どうもお騒がせしました。 >>72
エディタに、TeraPad を使っているけど、半角・全角文字へ変換ってある
こりゃ便利 >ファイル名に、ダブルクォートが入っている
ファイル名に、! が入っていたら、どうなる?
テレビ番組の録画で「何々!」「何々!!」みたいな番組名が、ファイル名になる場合 >>80
感嘆符が特殊文字になるのってインタラクティブなときだけじゃね? >>80
こういうのって何言いたいのかわからんな。「問題」でも出してるのか?? いやだから,感嘆符が特殊文字になるのはインタラクティブなときのみじゃないの? ! を特別扱いするシェルを使っているかどうかの問題ではないかな。
OSやファイルシステムが特別扱いしているってこともあり得なくもないが。
UNIX系OSだと / しか特別扱いしてないよね。 Linux 板で、テレビ番組名に、!!! みたいなものが入っていて、
それがファイル名になる場合に、バグるって言ってたから
! は、エスケープも出来ないとか 他の環境ではNGの可能性があるということを考えると
怪しい文字は極力ファイル名に使わないようにしてる。
ある意味思考停止だけどw
CD-R焼く時、使える文字がフォーマットによりまちまちで、
ものすごい複雑だったことを思い出したわ。
ロミオとジョリエットwとか、ロックリッジとかあったなぁ。 >>87
だから、なにを言っているのかわからんてww >>80
ばーかばーかさんへ
file "$1" が文字が原因で失敗する事例なんてありません
エスケープが必要な場合など存在しません。
わかったら黙って帰れ >>86
特殊文字って場合によりでしかないよな。特殊文字だから必ずバグる(?)なんてないし
シェルというか引数として受けたコマンドがって感じかなあ。bash自体がスクリプト中の引数を含めたコマンド文字列に特殊文字があっても何もしない/しないようにできるし
ID:htH9kPBSが言っているのは、ID:TC+4ZTQW が言っているコマンドラインでのヒストリ(参照)処理に引っかかる場合で、シェル「スクリプト」の問題ではないだろう スクリプトとして關係ないが、超シンプルにしての
$ ls '!'
ls: !: No such file or directory
まあ、そうだな
$ ls !
ls: !: No such file or directory
ほう
$ ls "!"
-bash: !: event not found
なんでやねんっ!ってとこではあるな
コマンドラインでも ! を打たなきゃファイル名がんなの入っていてもだし、! を含めたファイル名なんぞを打たなきゃでも ' でくくればいいんじゃね だからすごく単純な話で
$ cat ./hstex.sh
#! /usr/bin/env bash
case $- in
(*H*)
echo enabled
;;
(*)
echo disabled
;;
esac
$ ./hstex.sh
disabled
こういうことでしょ?
つまりシェルスクリプトになってるときbashはヒストリ展開を既定で行わないから
エスケープを考える必要はないの。 はぁ、シェル「スクリプト」かどうかの問題じゃないんだってば
>>93はevent not foundってでなかったんで
考えるのメンドーなんでぐぐって
https://qiita.com/Qutjl/items/6e0056853c94011d245b のネタパクるけどさ
$ ruby -e "puts 'Hello, World!'"
-bash: !': event not found
はい、たしかにそうなりますね。
テキストエディタで「puts 'Hello, World!'」という内容のcode.txtファイルを作成する
$ cat code.txt
puts 'Hello, World!'
$ a=$(cat code.txt)
$ echo "$a"
puts 'Hello, World!'
変数 a に先程の文字列を入れました
$ ruby -e "$a"
Hello, World!
はい、エラーになりません。
これはシェルスクリプトが特殊なんじゃねーよ。
C言語で、ソースコードに"\n"と書いてある文字列をprintfした時と
\nという文字列が入っている変数をprintfした時の挙動と一緒だろうが
プログラミングの基礎やで。ソースコードをパースするときの処理かどうかの違い >>95
なにを言っているのかわからんww なんか面倒なことになってるなww
「スクリプト」の問題じゃないよ、ソースコードをパースとかよくわからん例えに見えるけど、単に「コマンドライン」でのパース(?)の問題。それもヒストリ展開だけの。>>94でID:TC+4ZTQWが再び言及しているような
ああ、bashのバージョンで
$ ls "!"
-bash: !: event not found
にならんことあるな。新しいのは。
$ ls "!!"
でもいいよ。今度は
$ ls !!
の挙動が変わるけど。まあ '' でくくればいいだけ&単に「コマンドライン」での問題 えぇ……
もしかして俺が間違ってるのかと不安になるほど自信満々な書き方だなw >>96
>'' でくくればいいだけ
うっかり ' を二つ並べた。シングルクォーテーション >>97
まあ...気にすんな。「ナニ」か違う(?)と思ったのだろう。よくわからんけど 若者はヒストリー置換を知らないんだなあと感じいる俺はオッサン。
ヒストリー置換は対話的な入力にしか影響しないから、
スクリプトにするときは気にしなくていいよ。 >>97
そりゃ間違ってるでしょ。
シェルスクリプトになってるときは〜とか言っちゃってる
インタラクティブシェル上でも変数を""で囲えば同じなのに 初見イミフ、よく読んでもやっぱりイミフw
なんか問題点を勘違いしているでしょ
>>94のcaseからesacをコピペってみて実行してみ。たぶんそういう文脈での「シェルスクリプトになってるときは〜」だと思うぞ=間違ってはないと思うぞ
何を問題にしてんの?「インタラクティブシェル上でも変数を""で囲えば同じなのに」って なんでこんなに丁寧に教えてやらんと理解できんのか
>>62の話だろ
> だから、ディレクトリパス・ユーザー名とか、
> システムで使うものに、半角空白を入れたら、ダメ
>
> シェルスクリプトを書いている奴が、変数を" " で囲んでいないと、バグるから
ヒストリー展開はスクリプトだと既定で無効だが、
それ以前にファイル名にスペース入ってたりするから、
変数はダブルクォートでくくるのは当たり前なんだよ。
shellcheckすればデフォルトで指摘される項目
変数はダブルクォートでくくればいいって言ってんのに
今度は「ファイル名にダブルクォートが入っていたら?」
「ビックリマークが入っていたら?」とか言い出してんだろ
そ・れ・も「変数をダブルクォートでくくればいい」で終わりつってんだろ
ダブルクォートでくくればヒストリー展開が有効であっても
ファイル名に!が含まれてようが関係ない >>103
話の流れをよめ。
変数に入っている文字に
空白やダブルクォートやビックリマークが
入っている場合の話だ
変数をダブルクォートで囲めば全部解決
エスケープなんぞいらん ! と " は別の問題
話の流れをよめ...ってw だめだこりゃ それは>>73からの続きだろ
> ところでファイル名にダブルクォートが入っている場合があるので
> ダブルクォートで囲む前にsed -e 's/"/\\&/g' とやる必要がある。
これも囲む必要はない
ファイル名を文字列で直接書くならそもそも\でエスケープすればいいだけ
だからこれは変数の話であることは明白
その話の続きで>>80の
> >ファイル名に、ダブルクォートが入っている
>
> ファイル名に、! が入っていたら、どうなる?
という流れだ いや、だから、その話の流れはあるかもしれないが、途中からの話の流れは ! が特殊文字になるのはっていうだけの話だぞ?
その>>73は>>74で終わってるし、なんかまたわけからんのが出てきたが ! がっていうのはそういえばっていうだけの
なんかあなたが強調しているのはそんなのわかっている上でのだぞ?なんでそんなとこに拘っているの?? 俺はゆとり世代より下だがずっと指摘してたぞ(>>81)
そういう決め付けやめろ ファイルやディレクトリを引数に取り、その許可属性を返すコマンドってありますか。
少なくともPOSIX Utilityにはないと分かっています。
期待する動作はそのコマンドの名前をownとして
$ own /some/file
-rwxrwxr-x
というような具合です。 lsすりゃ済むのにunix的なセンスでそんなコマンドは作らないよ ls
それで満足できないなら作れ、さすがにそれくらいできるだろ >>114
stat -c '%A' /some/file >>114
lsまたは stat の出力の一部を自分で切り出せば良いのでは?
なんだったらそれだけをするシェルスクリプトまたはシェル関数作れば良い。 うはっw NGワードで引っ掛かってあれこれ変えてる内に回答が二つ書かれてたw >>117でわかるのに、unix的なセンスとか、ワロえる。
センスないのはむしろ。ぷぷぷw >>115,116,118
わたしも最初はlsの結果をcutするシェルスクにしようと考えたけど
>>117
GNUならそれで、BSDのstatなら stat -f "%Sp" /some/file な感じか
POSIXの縛りならlsとcutかもしれんけど stat -c '%A'
↑すばらしいです。ありがとうございました。 >>960>>970>>980
次スレ立てるならワッチョイで頼む OpenWrtでこんなの見つけた。何処がオリジナルだろう?
物自体はバイナリだけどシェルスクリプトと親和性が高い(?)
JSONのパースと生成の方法のアイデアとして
https://wiki.openwrt.org/doc/devel/packages/jshn
Library for parsing and generating JSON from shell scripts
こんなふうに出力される
$ jshn -r '{"a":1, "b":2, "c": [1,2,3], "d": {"A":1}}'
json_init;
json_add_int 'a' 1;
json_add_int 'b' 2;
json_add_array 'c';
json_add_int '0' 1;
json_add_int '1' 2;
json_add_int '2' 3;
json_close_array;
json_add_object 'd';
json_add_int 'A' 1;
json_close_object; >>126
あ、はい。ググればわかる。
なんか変な人がjqはクソだって言ってる
で頑張ってオレオレで変なの実装してるが、
すでにあるよって話 >>127
そのおかしな人の言うことを解釈すると
そのコマンドはオプション引数でデータを受け渡すのであまりよくないのでは?
Unix哲学としてはデータは標準入力から渡すべき。 でもあの人の言うことなんて聞いてらんないよね。こっちは宗教で食ってるわけじゃないんだからさ。
作って見せたツールだって痒いところに手が届かない部分は
「そんなのはそもそもこうこうであるべきで必要ない」みたいな感じでほっぽってるし
作ってマウント取って射精後スッキリになったら全くメンテなんてしないし。「各人個別で改修・メンテしろ」ってことなんだろうけど、
こんなの個人の便利ツール止まりで世界中の不特定多数の共有便利ツール・知識にはなり得ないよ。 何やってる人か知らんが、それはそれでいんじゃないの?
頼まれずに作ったツールの公開なんてオナニーそのものやろ 誰かが例の記事のはてブで言ってたけど,ああいう人も必要だとは思う。
というか正直俺はプログラマじゃない(つまりコーディングで飯食ってるわけじゃない)ので,
ああいう考え方にはすごく興味があるし,実際研究室の管理シェルスクリプトをPOSIX準拠で書き直したりもしてる。
しかし繰り返すがプログラマにとっては邪魔な存在なんだろうなとは感じる。
というか言い方がキツすぎる。 #!/bin/bash
for i in {0..5}; do
n=`date +%Y-%m-%d_%H '-d ${i} hour ago'`
echo $n
done
ループで時間を1時間ずつ過去にして表示したいんだけど実行すると
date: ` ${i} hour ago' は無効な日付です
て表示されます。
助け船おねがいします >>138
シングルクオートだと変数が、展開されない気がすダブルクォートにしてみて >>139
n=`date +%Y-%m-%d_%H "-d ${i} hour ago"`
ありがとう、動きましたw "-d ${i} hour ago" の部分が -d "${i} hour ago" ではないのに何故大丈夫なのかと思ったが、
短いオプションだからパラメータと繋がってても大丈夫ってことだったんだな。 上のやり取りをみてふと思いたって実験してみると
GNU dateではフォーマットにCSIとかに代表されるANSI制御綴りを指定できるけど
BSD dateでは無理だな。
POSIXではこの二つのどちらが正しい実装なのかはよく分からんが
個人的な意見としてはBSD dateのほうが堅牢で,GNU dateのほうが柔軟だとは思う。まあ当然すぎる事実だけどw BSD date の仕様が分からないけど、標準出力が端末とは限らないし
指定そのまま出すほうが正しいんじゃないかな 単純な文字列置換ってどうしたら良いですかね?
sedつかうとメタ文字の置換で困るんです その辺りが楽なperlでいいんじゃない?
シェルスクリプトから使っちゃいけないというわけじゃないし >>147
さーせん、こんな状態なんです。
# perl
-ash: perl: not found awkに正規表現じゃない文字列置換命令ってありましたっけ? >>151
perlが無いならrubyも無いでしょ はい、rubyもないし、pythonもなし、nodeもないです Ruby をインストールすれば?
漏れは、WSL で、Rubyを入れているけど >>154
残り容量600KBを切ってるので入りません
Rubyは依存関係も含めると圧縮された
パッケージサイズで1MB以上あります。 パターン文字列をsedで置換しちゃうとか(GNU sed の場合)
$ pattern='foo[1]'
$ sed "s/$(sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g' <<< "${pattern}")/foo[2]/g" <<< 'foo[1]'
foo[2] https://paste2.org/DsfvJPn9
(こういうのをすんなりレスで書けないのはイラつく)
変なこだわりは知らん。細かくはテストはしてないけどまあ動くんじゃね >>158
スクリプトの実行はできましたが、 %s/〜/〜/g
だと〜に/が入っていた時に困ります。
〜には何が入るかわかりません。
あとviは標準入力から読み込めませんでした
できれば標準入力から読み込みんで標準出力に出力したいです。
ちなみにviのバージョンです
# vi -H
These features are available:
Pattern searches with / and ?
Last command repeat with .
Line marking with 'x
Named buffers with "x
Some colon mode commands with :
Settable options with ":set"
Signal catching- ^C
Job suspend and resume with ^Z
Adapt to window re-sizes
BusyBox v1.28.3 () multi-call binary.
Usage: vi [OPTIONS] [FILE]...
Edit FILE
-c CMD Initial command to run ($EXINIT also available)
-R Read-only
-H List available features >>159
GNU sedじゃないからだめなんでしょうね
# pattern='foo[1]'
# sed "s/$(sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g' <<< "${pattern}")/foo[2]/g" <<< 'foo[1]'
-ash: syntax error: unexpected redirection
ちなみにsedの--versionと--helpです。
# sed --version
This is not GNU sed version 4.0
# sed --help
BusyBox v1.28.3 () multi-call binary.
Usage: sed [-i[SFX]] [-nrE] [-f FILE]... [-e CMD]... [FILE]...
or: sed [-i[SFX]] [-nrE] CMD [FILE]...
-e CMD Add CMD to sed commands to be executed
-f FILE Add FILE contents to sed commands to be executed
-i[SFX] Edit files in-place (otherwise sends to stdout)
Optionally back files up, appending SFX
-n Suppress automatic printing of pattern space
-r,-E Use extended regex syntax
If no -e or -f, the first non-option argument is the sed command string.
Remaining arguments are input files (stdin if none). >>161
ありがとうございます。動きました。
さくっとはできないもんなんですね。 >>163
ああ、bash じゃなくて ash だから here string("<<<") が使えないのね…
# echo 'foo[1]' | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g"
こんな感じかな。 >>164
-v のはawk内で展開されての右辺を文字列リテラルとして処理されてえのっぽい。ので、バックスラッシュが鬼門のよう
https://paste2.org/IhEG146f >>166
なんかプラスが入った時おかしいっすね
GNU sed
$ pattern='+'
$ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g"
foo[2]
$ pattern='a+'
$ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g"
foo[2]+
busybox sed
# pattern='+'
# echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g"
sed: bad regex '\+': Repetition not preceded by valid expression >>167
う〜ん、ash でやってみたけど、1番目、2番目は問題ないなぁ
Busybox の sed は -r オプションがないんじゃなかったかな あれ?でもさ、
pattern='+'
$ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g"
foo[2]
入力が '+' でパターン文字列も '+' だから foo[2] に置換されるのは正しいんじゃないかな?
でもまぁ、GNU sed で -r オプション付けると `+` 記号がメタキャラクタになるから、付けない場合は
`+` を考慮する必要はなかったのね…
$ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*^.$/\]|\[|\])/\\\1/g')/foo[2]/g"
こっちの方が良いみたい。 >>171
ごめん、紛らわしかった。
そっちは正しいパターン
おかしいのは「a+」の時 だから要するに + はエスケープしたらダメってことなのか?
単純な文字列置換って正規表現置換よりも簡単な処理なのに
どれも面倒くさいなぁw ashの日本語manページはないのかなと思って検索した時に出てきた画面。
https://i.imgur.com/xzEhcAc.png >>176
カラフルな検索結果だがこれと言って役に立たないという共通点があるな・・・ >>177
ニヤニヤできるぞ
今更だがluaなら入ってたで grep にある -F オプションと同等のオプションが sed にも
欲しいところではあるなぁ。生まれは同じなのに sed には無い
のは何故…(実はあったりして) Googleのシェルスクリプトに関するコーディング規約で
「そう〔訳注: 連続したパイプ節が二つ以下〕でない場合は一行につき一つのパイプ節を含むようにする。その際,二番目以降のパイプ節は,2文字分の欧文空白による字下げを行なう。」
とあるんだが[1],ここの例示が
command1 \
| command2 \
| command3 \
| command4
となっている。
普通(といってもパイプをこのように多用しかつ改行しまくっている例はほとんど見たことがないのだが)https://github.com/ShellShoccar-jpn/kotoriotoko/blob/master/BIN/twtl.sh#L297
↑こことかでは
command1 |
command2 |
command3 |
command4
という書き方になっている。
俺はこっちの書式のほうが見慣れているので,自分のシェルスクリプトもこういう書き方でやっているのだが,みなさんはどういう書き方がいいとかあるだろうか。あるいはGoogleとは別のところが発表してるシェルスクリプトのコーディング規約とかないだろうか。 一応俺の意見: 後者の利点としては,バックスラッシュが不要なこととコマンドが行頭に来て流れを掴みやすいということがある。
加えて簡易的なデバッグするときに,前者は
command1 \
| command2 \
| cat
# | command3 \
# | command4
などとするのに対して 後者は
command1 |
command2 |
cat
# command3 |
# command4
このように「新しい行を挿入してcatを入力」という単純な動作ができるので,例えばVimやEmacsなどマクロが作れるエディタなどでのデバッグ用の編集に有用というのもある。
実際俺はシェルスクリプトに関してはIDEを使わずVimで開発していて,この類のマクロを作成して便利に使っている。
長文すまん
[1]: http://google.github.io/styleguide/shell.xml#Pipelines 簡易的なデバッグするときに前者は
command1 \
| command2 \
# | command3 \
# | command4
などとするのに対して 後者は
command1 |
command2 |
# command3 |
# command4
のように行頭に#をいれるだけではSyntax errorになるから前者の方がデバッグなど編集に有用とも言える
個人的には大差ないと思う 末尾にバックスラッシュを入れることで次行を見なくても明確にコマンドが続くことがわかるから前者を支持する >>184
でも>>183のように,コメントアウトすると
「末尾にバックスラッシュがあっても後ろにコマンドがない(実行されない)」
という状況がありえる以上,
末尾のバックスラッシュの有無を過信するのはよくないと思う。
もちろん気をつければいい話だが。
なんというか,ハンガリアン記法の間違って流布された方法に近しい危険性がある
(変数i_VARを見て,本当はfloat型なのにint型だと思い込む) ていうか少なくとも二人くらいは
後者の方式に賛同してるのか。
Googleもそっちを推奨してるし,俺も手癖を直すべきなのかな。 >>184
それ、末尾にパイプ記号あるから〜
と同じことじゃね?
個人的には見栄え的には前者の方を採用したいが余計な継続記号が不要な後者で書いてる バックスラッシュで行継続(改行)って多くの言語で採用されているから
多くの人はパイプ先頭、バックスラッシュ行末じゃないかな? 俺は1行か2行くらいなら後者だな。
何行もずらずら並べるなら中括弧で囲んでパイプ記号を先頭に持ってくるかも。
行末にバックスラッシュを置いて行継続はあまり美しくないと思うのでなるべく書きたくない。
>>191
構文的に行末で文(言語によっては式)が完結できていれば行末を文の終わりとみなし
そうでなければ次の行に継続、というのもshそのものをはじめpython, JavaScriptなど多くの言語で採用されているよ。
(pythonはshと同じく行末バックスラッシュで継続もできるが)
更にRubyは行の終わりで完結できるように見えても次の行の先頭を見てどうするか決めていたりする。 >>190
無知ながら初耳だった。
scshの説明をざっと読んだけど、今回の問題の解決になる?
むしろ「括弧の前で改行するかいなか」みたいな新たな規約が生まれそうじゃない? シェルスクリプトの話題からちょっと外れるんだけど
$ somecmd --help
としたときの手引きって標準エラー出力に出力すべき?
GNU Coreutilsでは基本的に標準出力なんだけど……。 stderr だとページャにつなげたい時に
$ somecmd --help 2>&1 | $PAGER
とかするのが面倒。でも zsh とかだとエイリアスで
どうにかできるんだっけ? >>196
$ somecmd --help |& $PAGER
↑これでいいんでは >>198
dクス、"|&" が使えるのは bash と zsh だけかな >>199
あ ごめん。それPOSIX互換じゃねえわ
知らんまにbash主義に染まってた 反省。 csh由来のものをbashismというのはどうかと…… まあ>>201はそんな大層な意味で言ってるわけではないだろ。単にbashしか使ってない使い込んでるってだけの意味だろう。無知でしたという --helpで思い出したけど、あれって書き方ってあるの?
usageの書き方とかオプションの書き方とか
引数は大文字にするの?とか [ファイル]... とかの[] とか ... の使い方とか
あるようで、バラバラな気もしている >>205
とりあえず 天下のPOSIX様はこうおっしゃってる
utility_name[-a][-b][-c option_argument]
[-d|-e][-f[option_argument]][operand...]
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html#tag_12_01
ので 俺はそれに従ってる。だいたいのmanページやGNUユーティリティの--help出力もこれに準ずる形だと思うよ >>206
多分>>205はそういうのを求めてたんじゃないな シェルスクリプトの言語にJavaScriptってアリだと思う?
#! /usr/local/bin/js24
みたいなシェバンでさ。 シェルスクリプトっていうのは
シェルとして実用に堪えるものじゃないとダメ
名前の通り
コマンドを呼び出すのに、いちいちsystem関数を
使うとかいうのは、シェルとして使えない
ls だけでlsコマンドを実行できるようにしたら
シェルスクリプトと認めてもいいが シェルスクリプトというより、他のインタプリタ言語と同じようにコマンド(内容)記述用としてあっていいって話だろう 普通にやるだろ。
#!/usr/bin/awk -f
とかだってたまにはやるぞ。
「#」がコメント扱いになる言語なら
気にせずどんどんやればいい。
そもそもshebangはUNIX上で「スクリプト言語」を呼び出す時の記法であって
現代UNIXではシェルは一切関与しないカーネルの機能だから
「シェルスクリプト」なんかじゃない。
(つまり実はスレ違い)
なお昔のSystem-V系UNIXにはカーネルにこの機能がなくexec(2)が失敗するので、
その場合にはシェルが代行してスクリプトのインタープリターをよびだしていた。
そういうUNIXはほぼ滅びたけどシェル側にはまだこの代行機能が残っていたりする。
シェルは関与しないのにshell-bangなんて変な名前だけど、
この言い方自体比較的新しくて、実装されてからだいぶ長い間名前がなかったんだよ。
普通はカーネルが処理しててシェルは関係ないってことを
知らない奴がつけた名前じゃないかと前から疑問に思ってる。 >>212
> 普通にやるだろ。
> #!/usr/bin/awk -f
> とかだってたまにはやるぞ。
落ち着け
それはスクリプト言語だ
"シェル"スクリプト言語ではない > シェルは関与しないのにshell-bangなんて変な名前だけど、
shebang を shell-bangの略だと主張する人は少数派だよ >>208
それはシェルスクリプトじゃなく、
JavaScriptスクリプトだ スクリプト
スクリプトスクリプト
スクリプトスクリプトスクリプト
スクリプトスクリプトスクリプトスクリプト 👀
Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b) >>213
落ち着け。
もうちょっと先まで読めば同じことが書いてあるぞw >>214
shebang の e って何から来てるの?
俺は shell から来てるんだと思ってた。
なお shabang という書き方も少数派だが使われてはいるみたい。
実際 sharp-bang なわけで、こっちなら分かる。
shabang ならシバンじゃなくて、シャバンだよな。
シャバ〜ン。 なんつーかオッサンばっかだな。
まあ俺もそういう反応を期待してたわけだがw >>219
#! -> sharp-bang -> shabang -> 単語ならshellだしすでにあるとても似たshebangでいいんじゃね、shebangの意味自体が似合ってるし
とか。shebangというれっきとした単語の由来は別にある 元ネタ分かんねーと思ったらおっさんどころかジジイじゃねーか マジで検索しても元ネタわからんw
平均年齢どのくらいだこのスレは >>232
>>227 が元ネタ。
ギャバン/シャリバンのバンと、シャリバン/シャイダーのシャと、
ギャバンのオープニング末尾のギャーバーン♪
からの連想でシャーバンと書いた。
残りは歌詞検索とかすると分かる。
こんな連想するの俺だけかと思ったら他にも複数いてワラタ >>234
男なんだろ?
の一言でギャバンOPテーマとわかるのはギャバン世代というよりもFLASH黄金世代な予感
実際俺はギャバンじゃなく当時の面白FLASHギャバソで知った >>235
そんなFLASHがあったのか。
4月のAnisonDaysに串田アキラが出てギャバンのOPを歌ってたから、
それで記憶が蘇ってる人もいるかも。
てゆうかそれ俺。 そして>>228の癒着というのはケロロ軍曹の登場人物
556(コゴロー)が変身するときのセリフ
元ネタはギャバンが変身するときに言うセリフの蒸着
40代ならここまで連想する 蒸着の元ネタってギャバンだったのか…
DeadSpaceのアーマー更新シーンを蒸着言うやついたけど元ネタあったんだな >>237
あ それなら知ってるわ
ケロロ軍曹だったら子供のころアニメで観てた バッチファイルやパワーシェルもシェルスクリプトですか?
何言語っていうんでしょうか? >>241
バッチファイルはシェルスクリプトには入れないなあ。
PowerShellの方は、PowerShellスクリプトって言うな俺は。 バッチファイルをシェルスクリプトに入れない理由はないと思うけど? スクリプトに入れるのはありだけどシェルスクリプトって言う奴は少ないと思う ちゃんとした定義は知らんが、
シェルスクリプト=.sh
バッチファイル=.bat
と大抵は認識してそうな印象 シェル スクリプトと言えばだから違うくね。バッチファイルをシェルスクリプト(ファイル)と実際に呼んでるヤツを見たことはないな
command.com自体が原始的でシェルのように打ち込んでってってのも見ない。あれはやっぱりバッチファイルを作るためのでしかないってうすうすわかっているからじゃねとか >>250
最初から結果ありきで書くなよ。単にお前がバッチファイルをシェルスクリプトに入れないためのこじつけを
お前が考えてるだけじゃねーか
wikipediaにも書いてあるし
> スクリプト言語の一種は、ジョブ制御の自動化から生み出されたもので、システムプログラムの起動と制御を行う。
> そういう意味ではシェルの祖先としてIBMの Job Control Language(JCL、ジョブ制御言語)があるとも言える。
> この種の言語の処理系(インタプリタ)の多くは、UNIXのシェルやMS-DOSのCOMMAND.COMといった
> コマンドラインインタプリタと呼ばれるものである。 >>251
「実際」にだよ。お前の周りでバッチファイルをシェルスクリプトと呼んでいるヤツいるの?
呼んでもいないのになぜそんなとこに拘る。バッチファイルはバッチファイル、Unix系のはシェルスクリプトはシェルスクリプトでええやん
逆にシェルスクリプトで書かれたはファイルをバッチファイルとなぜ呼ばないまでこだわれよ、だったらw バッチファイル=バッチスクリプトであってる?
バッチファイル=シェルスクリプトはまちがえ? >>258
シェルスクリプトというカテゴリがあって、
その中で、特別に言語を指定する場合は、
bashスクリプトやバッチファイルなどという具体的な呼び方をしている
バッチファイル = シェルスクリプト ではなく
バッチファイルはシェルスクリプトに含まれる >>258
バッチファイルを作るための制御文なんぞを特に命名はしてないんじゃないの。バッチファイルというのがあってそれを作る/それで使える制御文は的な存在。誰も名前を言えないように
バッチファイルのバッチとは バッチ処理 という古典的コンピュータ用語。MS-DOS/Microsoft上でバッチ処理を書いたファイル/バッチ処理のファイルということで、バッチファイルと名前付けしたにすぎない
シェルスクリプトファイル、シェルスクリプトで書かれたコマンドも、広義ではバッチ処理のファイルなのでバッチファイルと呼べるが、そんな呼び方をする人はいない
そもそもシェルやシェルスクリプトだって、Unixでそう呼んだからにすぎないんだけど、どうして一緒くたにしたがるのかわけわからん
てかさ、バッチファイルのアレもシェルスクリプトだって言いたがりは、このスレでバッチファイルのことが出てきたらどうすんの?当たり前のように受け止めるの?てか、そんなトンチンカンが現れたことがないんだから、わかるようなもんだと思うけど >>260
>バッチファイルと呼べるが、そんな呼び方をする人はいない
サーバーなんぞの1日深夜1回とか1週間に1回のごちゃごちゃ処理するのを呼んだりしているかもしれない。そういう狭義のある意味全くもってなバッチ処理を記述したファイルという意味で > てかさ、バッチファイルのアレもシェルスクリプトだって言いたがりは、このスレで
> バッチファイルのことが出てきたらどうすんの?当たり前のように受け止めるの?
なにか問題でも?
>>2に
> ・特記なき場合、Bourne ShellもしくはPOSIX準拠のsh可換シェルが既定です
> csh/tcshでのシェルスクリプトは*まったく推奨しません*。
などと書いてあるから、バッチファイルと明記して書けば問題ないでしょ? なにそれw
無茶苦茶やな。書かなくても誰もがわかっていたからそんなのが出てない書く必要もないという事実を無視して自説のためにでしかないやん なにいってんだか。
バッチファイルという名前が有名だから、普段はそっちの名前で読んでるだけで
cmd.exeはシェルだし、シェル上で動く言語という定義なんだから、
シェルスクリプトに当てはまるという至極まっとうなことを言ってるだけ >シェルスクリプトに当てはまるという
だから?で?それが何かの役に立つというか意味があるのか?ってことだよ。別に当てはまろうが当てはまらないだろうが意味ないだろう??
バッチファイルといえばアレで、シェルスクリプトといえばコレでいいことやん。それでなにも問題もなくうまくもいってるってのが、このスレででもっていう
バッチファイルをここで話題にしたがってるの??ww cmd=シェルってのがピンとこないんだよな
大体シェル=シェルスクリプトみたいな使い方してるからなんだけどさ >>265
意味がないならシェルスクリプトでいいだろw 薄いな。なんでそんなに拘る。意味がないのはあんた個人に対してだよ
バッチファイルがシェルスクリプでもなければならない意味を言いなさい コマンドラインインタープリタを自動化したもんを
シェルスクリプトとというの
頭悪いバカのみんな分かった?
当然、バッチファイルもシェルスクリプト
わかった? >>268
Unixでsh(系=シェル)を使うと、貧弱なにもできないって感じからcmd=シェルとはピンとこないこともあるな
シェルを起動してとは言わんし。てか大体の記事とかでも、いや、Microsoftでさえシェルとは呼んではく、Command Promptだからね >>270
普通にcmd.exeがシェルだし、そのシェルの言語で動くんだから
シェルスクリプトですってだけだが?
なんでシェルスクリプトじゃだめなの?
> cmd=シェルとはピンとこないこともある
お前が本質をわかってないからだろうねw > 貧弱なにもできないって感じから
何もできないからなんだっていうんだろうか?
リダイレクトできるよ? パイプ使えるよ?
まさにシェルスクリプトの特徴だよね >>273
さっぱりだな。だからそれの意味を教えなさい。そんなにづっと続けるのだから意味があるんでしょ?あなた個人に
それがさっぱりわからんのだよ。「はいはい、バッチファイルもシェルスクリプトだね、誰もそう呼ばないけど」で満足なの?
本質wwあなた個人の意味も言えないのに本質wwwって思ってしまうよ プリンタに内容がPDLのファイルをリダイレクトすれば
いまでも普通にコマンドプロンプトで印刷もできるからな
コマンドプロンプトでコマンドからなんでもできる >>274
>Unixでsh(系=シェル)を使うと
って、言ってるのだけど。ああ...なんだ..MS好きか?単に
shとcmdの違い/使い勝手が天地なのは使えば明らかだと思うけど。shと同等にcmdを使ってるの?もしかしてsh使ってないとかはないよな?w >>277
だからなんで高機能なものがシェルスクリプトの定義だ
なんて思ってるのさ?
低機能なシェルスクリプトってだけだろ
つーか、なにができないとシェルスクリプトとは認められないって言ってるんだよ
お前の定義言ってみな。矛盾しないような。 >>278
一般的に、シェルスクリプトと言えばUnixが元のあれやこれや
一般的に、バッチファイルと言えばMS-DOS/Windows/Microsoftのあれやこれや
一般的に、バッチファイルと言えばわかるものをシュエルスクリプトとわざわざ言い換えはしない
シェルはもともとUnixでの言い出したことだし、sh(シェル)/cmd(コマンドプロンプト)でそれぞれ、シェルスクリプト/バッチファイルと呼んでいた
コマンドをインタラクティブで処理するやつをどうであれシェルと呼ぶ見方もあるだろうが、それは一般的ではないな。cmdはやっぱりCommand Promptなとことからも
ってとこ。別にバッチファイルはバッチファイルで何も問題がなく、わざわざシェルスクリプトと言い換える意味がわからん、混同という弊害もあるし まさにシェルがなにかついて記述されている
https://en.wikipedia.org/wiki/Shell_script
Typical operations performed by shell scripts include file manipulation, program execution, and printing text.
A script which sets up the environment, runs the program, and does any necessary cleanup, logging, etc. is called a wrapper.
The term is also used more generally to mean the automated mode of running an operating system shell;
in specific operating systems they are called other things such as
batch files (MSDos−Win95 stream, OS/2),
command procedures (VMS),
and shell scripts (Windows NT stream and third−party derivatives like 4NT?article is at cmd.exe),
and mainframe operating systems
are associated with a number of terms.
バカの世界では違うらしい >>280
よく読んでみ。なんかこれ幸いな単語で喜んでいるだろう? >>279
一般的にって、全部お前がそうしたいってだけじゃねーかw >>281
お前のために翻訳してやったぜ
> シェルスクリプトは、あるコンピュータプログラムによって実行されるように設計されたUnixシェル、
> コマンドラインインタプリタ。[1]シェルスクリプトのさまざまな方言は、スクリプト言語と見なされます。
> シェルスクリプトによって実行される一般的な操作には、ファイルの操作、プログラムの実行、
> およびテキストの印刷が含まれます。環境を設定し、プログラムを実行し、必要なクリーンアップやロギングなどをラッパーと呼びます。
>
> この用語は、より一般的には、オペレーティングシステムシェルを実行する自動モードを意味するためにも使用されます。
> 特定のオペレーティングシステムでは、バッチファイル(MSDos-Win95ストリーム、OS / 2)、
> コマンドプロシージャ(VMS)、シェルスクリプト(WindowsNTストリーム、4NTのようなサードパーティ製の派生品)などがあります >>282
だーーかーらーー、今までのこのスレでバッチファイルの話をするやつなんていないことから、一般的だってお前にもわかるだろう
>>283
だーーかーらーー、その「一般的」って一般的ではない一般的だよw 他の全文読んでみ。どれだけバッチファイルに言及してる?そこだけだろ?
てかさ、お前の周りでバッチファイルをシェルスクリプトと言っているのそんなにいるの? >>284
? もともとこのスレはUnix板にあったし?
>>2にsh系前提って書いてあるし?
このスレの一般的じゃなくて、世間一般の
シェルスクリプトの定義の話をしようぜ?
なんならここでバッチファイルの内容を入れても良い
次から>>2の内容を書き換えてあげようか? なんだろ。こんだけ世間擦れして、なんかどこぞの辞書的なとかが絶対ってこだわり続けるのは...あれかな??w
>>285
そういう無茶苦茶言えるのは、やっぱりアレだろなと思わざるを得ない
誰もそんなの望んではいないだろうと思われるけど。Unix板にあろうが「シェルスクリプト」でググって飛び込んできても不思議ではないな、あんたの言い分では
てかそのあんたの言っているその時点で暗にあんたもシェルスクリプトとバッチファイルは違うと認めてるようなもんなんだが、わからんだろうな はいはいわかった。
次スレは>>2を書き換えたからな 拗らせるぐらいなら参加しなきゃいいのにw
すげえな今までを全く無視して個人的にそうするという自己中ぶりは 自覚ないみたいだな
俺はシェルスクリプトの正しい定義を言ってるだけ 広義ではバッチファイルをシェルスクリプトと呼べるかもしれないが、一般的にバッチファイルをシェルスクリプトとは呼ばないし、そう思っているのは少なく明らかに分けて考えて言う方が多い
「一般的に」というのは「広義では」という場合にも使われるのを知っておこう
ただ、それだけのことなんだけどねえw バッチは別スレあるし、棲み分けすればええんとちゃう?
まあアスペのためにもスレタイにUNIXでも付けとく?
詳しくは>>2に入れておいて
あとUNIX板から移動したって事で>>1にはUNIX板の最終スレは残しておくか これは言い方を逆転させただけ
一般的にバッチファイルをシェルスクリプトとは呼ばないし、そう思っているのは少なく明らかに分けて考えて言う方が多いが、
広義ではバッチファイルをシェルスクリプトと呼べる UNIX、Windows、それぞれの文化の中での言い方なのに
何ムキになってるんだい?
UNIXの文化の中で、シェルスクリプトといえばsh系のスクリプトのことを通常は意味するだろう?
わざわざ、Windowsバッチファイルを「シェルスクリプト」と呼ぶことは、
英語圏の外国人が日本に来て、何故英語が通じないと言ってるようなもので、
UNIX文化圏の人から見たら、「何言ってんだこいつ」ということになる。
このスレがプログラム板に来たからといって、シェルスクリプト自体がUNIX文化であることには疑いなく、
正しいか正しくないかということとはまた別の問題なんだよ。 >>295
ワッチョイ入れておいた方が良くないか?
>>4の経緯があるし 拗らせすぎ。なぜそこまで...必死と言わざるを得ないw 別スレ立てるなんて、もう嫌がらせでしか無くない?
しかも2つも。 >>298
ほんとそれ
ワッチョイ入れて粘着する奴はNGした方が良さそう まったくもって酷いことするヤツラがいるもんだ。。。
オレにはこんなことできない。。。 件の輩、ドザの工作員と考えないと説明がつかないw
ご本人に住み分けを含めて説明してもらわないと まぁこういうことがあるからワッチョイ導入しようってなったんだし
ここにきた選択は間違ってはいなかったな ID:TgLfCzAb 抽出レス数:14
ID:9FNycoly 抽出レス数:1 → シェルスクリプト総合 その29
ID:A3V5N+C6 抽出レス数:3 → 【POSIX】 sh系互換 シェルスクリプトスレ
IDの流れ(ダブりなし)からすると、同一人物のようだね。
アラシは一人だったってことだ。
これは推測にすぎないが、UNIX板の件のスレも同一人物の可能性が高いと思う。
後は件のスレをスルーして沈めておくのが懸命かな。 >>251
JCLなつかしー
DD文でFORTRANのWRITE/READ文の装置番号と実際のファイルを対応させる記述すんだよね
だからOPEN/CLOSEなんて使わなかった
パソコンなら簡単なのにメインフレームは一々領域確保やらにゃならんから面倒だなと常々感じてた つまりバッチ=シェルだけどシェルっていう人はすくないってことね じゃあパワーシェルはシェルスクリプト?
それともWindowsはシェルとはいわないってこと? >>312
当然シェルスクリプト
cshと同じあつかい 昔は仕事でバッチを沢山作ってきたけど
退職して、数十年、コマンドや、シェル一切忘れてしまった
再びシェルスクリプトやsed.awk,viリファレンス買い込んで復習中
昔はスクリプトといえば、Bshとawkしか知らなかったから、何やるにもawkスクリプトを何十行も書いてた
まあ、新規インストールの必要ないから客先の環境そのままでも動かせるから良かったんだけどね
大型のスーパーコンピュータで数十行のawkスクリプト動かすってのも何かシュールだったな http://pubs.opengroup.org/onlinepubs/009695399/utilities/tput.html
ここを見るとtput colsおよびtput linesは標準で使えないと読めるのですが
POSIXに準拠した形で端末の幅などを取得するにはどうすればいいんでしょうか POISXコマンドであるtput使ってればいいんじゃないの
tputの仕様上は、端末(というかTerminalアプリというか端末エミュレータ)までは知らんってことじゃないの
tputの仕様/機能を満たすために後は勝手にやってくれってことじゃないの。で、当然勝手にやってる、というか、それも標準的な方法でやってるだろう(だいたいはtermcap/terminfoとかベースで) POSIX 準拠かどうか分からんけど、
$ stty size
じゃだめなん? ID:QAQ5xX6o ただの知識自慢?OpenWrtって >>320
いえ すいません言葉が悪かったです。
POSIX標準としてのtputコマンドはあるのです。
http://pubs.opengroup.org/onlinepubs/009695399/utilities/tput.html
しかし そのオプションとして“cols”や“lines”が記載されていないのです。 直接、端末に問い合わせる
https://unix.stackexchange.com/questions/16578/resizable-serial-console-window
いちおう、POSIXコマンドオプション内ではあるな。まあ、端末種によって判断しのだけど、2つぐらいに集約されてんのかな?
C関数ではPOSIXのがあるので、ちっちゃいコマンドをCで書く
http://austingroupbugs.net/view.php?id=1053
らしい。時代を先取りして(?)気にせず >>322 を使う というか、
COLUMNS LINES でええやん
http://pubs.opengroup.org/onlinepubs/009604599/basedefs/xbd_chap08.html
んなの設定してないっていうしょぼい環境だったら、しょぼいので設定してくださいって、ユーザに固定値でも設定させれば済むんじゃないの http://austingroupbugs.net/main_page.php
↑このサイト初めて知ったわ。
ここで次期のPOSIX標準がだいたい把握できるんだな。
ところでxargsに-0オプションが付くかどうかってどうやって調べればいいですかね >>329
実行してみりゃいいだろ。
xargsなんて副作用なく機能判定できる
簡単なコマンドだ >>317
組み込み向けでわざとない環境を作ったりすることはあるけど、
普通はあると仮定して問題ないよ。
総ディスク容量10MB以下のベル研UNIX の頃からあるコマンドだから。 >>330
いやそうじゃなくてPOSIX標準に取り込まれるかどうかってことです
findの-print0オプションはこの間採用されたものの
対応するコマンドでナル文字区切りのデータを受け取れて,さらにそれを区切りとして解釈できるものが
awkくらいしかない状況なので
多くの拡張実装(BSDやGNU)で取り入れられているxargsコマンドの-0オプションが
POSIX標準にならないかな というのが知りたいのです。
そしてその情報をどう入手すればいいのか今迄分からなかったんですよ。 次期POSIXや将来のPOSIXで入れる入れない機能みたいな議論を知りたいってことでしょうか >>333
その通りです 言葉が足らずもうしわけない >>334
ttp://austingroupbugs.net/view.php?id=244
を見ると追加する方向ではあるみたい。
でもレビュー中状態でもう7年近く止まってるから、いつになるやら。 他にもあるけど、managerはあくまでも拒否って感じ。確か2015あたりのもあるけど、同じ応えばかりw 毎回 -exec {} + を書いてるよね。
でも close はされてないし、うーん この 0000251がファイル名に改行を認めるべきか認めないべきかっていうのがありの
んなのとっとと認めないでcloseすれば話が先にすすむのになって感じかなあ。議論が長いのでよくは読んではいない まあ互換性の最後の砦だから 新しい機能を付け足すのに慎重になりすぎることはないのかも >>339
dwheelerさんが問題解決を拗らせてると見えなくもないw
ファイル名に改行を認めないで、改行をNULLの代わりにxargsが対応すれば済むような。readはマズいのかなと思うがNULLと改行が同時に必要ってあるのかな?? >>341
NULL=ヌル文字'¥0'のことね。いちおう(なぞ) >>341
マルチバイト文字列の2バイト目以降に改行コードが入る可能性は? >>343
議論でEBICDICでとかあったが、そんなのももういらないUnicodeでいいやんここ(5ch)もいい加減Shift-JISを捨ててUnicodeにしやがれっ
あるの?知らん。あったら他でも問題あったりするんじゃないのかなあ。dwheelerさんもそんな感じで重箱の隅的なwなのになぜか-0や-print0はええやん的な >>343
UNIXでサポートされてる既存のエンコーディングにそういうのはないし、
今後もサポートされないと思う。 COLUMNS LINES でいいわけがない
xtermみたいなターミナルエミュレータでも普通にリサイズされるからな
しらん間にサイズが変更されるttyなんかいくらでもある
ttyのサイズについて、常に正しい値を取得したい場合は
常にttyのサイズが変更されたシグナル(SIGWINCH)を受け取るようにして
毎回、COLUMNS LINESの環境変数を更新し続けるとか工夫しないと難しい
↓こんな感じのやりかた
trap 'COLUMNS=$(tput cols) LINES=$(tput lines)' WINCH
あとはioctrlでTIOCGWINSZをじかにとるぐらいしか思い付かない >>346
俺の環境では、COLUMNS LINES が自動で変わるけどな。サーバーにssh接続して、クライアントでウィンドウサイズ変えても、ちゃんとサーバー側shellでのCOLUMNS LINESは
ので、それが当たり前かと思ってたよw xtermでもやりゃできるんじゃないのってか、そんな古いのは対応しないのかな xtermでもちゃんとCOLUMNS LINESがリアルタイムに変わるやんけっ! なるほど!逆にローカルでは何もしないのか。なるほど。なんでやねんっ!xtermのせいか xtermが対応してるとか
そういう問題じゃないからな
ttyはただのダム端末だからな
xtermみたいにサイズを変更できるターミナルがあって
それに対応できるかどうかという問題になる TTYの幅とかの概念あるの?行はまず無いでしょ。TTYの話じゃないよ
Terminalアプリでローカルでもちゃんとしているのはあるけど? ただな幅の情報が取得できないと
cursorライブラリなんか使えない
ウィンドウサイズが端末の幅とか関係なく
好き放題サイズを設定できるとしても
使いようがない ターミナルはエコーされた文字を
標準出力や標準エラー出力に出力するだけだからな いやいや...いやいや...
xterm前提とか、今何使ってるの?? オレはxtermを例にあげただけで
xtermだけじゃない
puttyでもTeratermでもなんでもいい 昔のwindowsに附属してた
telnetでもいい あー...
ちょっとLinuxのでも使ってみ。今時は違うから。まあ、そゆのも対象にしたら使えないかもね telnetって...
まあ、そんな古いのを対象にしたらそかもね。なにかPOSIXの貧弱さに通じるものがあるなw むしろ物理コンソールで計算機さわることのほうが希だからな
まずサーバーだったらxなんか立ちあげることなんかありえないから
xを使うようターミナルエミュレータを使う機会なんかまずない 趣味や遊びで使う分にはいいかもしれないどな
仕事で使う場合そんな使い方はまずしない だったら、今時はssh接続一択じゃないんじゃないかなあ。それで万事解決のようなww
puttyでもTeratermでもssh接続ならちゃんとしているのでしょ? 仕事ならなおさらssh接続一択のような。まあ、仕事では未だにtelnetでしかとかいうとこがあるかもしれないが、そうじゃないのは趣味や遊びと決めつけるあたり、ホントに仕事でやってんの?と疑問 わかったか
オマエがニートだと思ったから
それようの書き方してる
わかってしまうのが怖い 意味わからん。自信たっぷりだね。それだけはわかるw telnet(オレはターミナルの例としてあげただけだ)はないにしても
xサーバーたちあげることはまずない
そんなもん使ってみればいいとか勧めてるいってる時点でな
残念なことに大体察しはつく Xサーバー??何を言っているのか。Windows前提絶対でモノ言っているでしょ?Windowsつかわなきゃ仕事じゃないと言っているわけ??
Windowsでウィンドウシステムが起動してそれを使ってるのと同じだよ。Windows以外でも てか、なんでこのスレでWindows前提絶対やねんっ。別にいいけど、他の作業環境を知らない認めないのはナイな なにをいってるのか って?
オマエがいってることが意味がわからんわ
Xサーバーたちあげないで
どうやってそのUNIXライクな計算機のwindowを表示するワケ
なにも分かってない頭悪いのが使ったつもりになってるのが分かったわ
コレはもう確定 Linuxデスクトップでは普通に起動するでしょ?別に起動するって意識しなくて。Windowsでウィンドウシステムが起動しているのと同じだよ
このスレなんだから、Linuxメインで使っているのいてもおかしくもなんもないだろうにってことだけど?
Linuxを勧めるから仕事じゃないってw 俺のはLinuxでもWindowsでもないけど仕事でもよく/それなりに使われているんだけどなあ Linuxデスクトップとな。。。
ちなみにX端末ってなにかわかる? どういう意味での?X端末は何もしないでXサーバが処理をするとかいう?? なんか老害?自分の古い知識でそれ前提絶対的なwもっと視野を広げた方がいいような。コンピュータ好きなら まあた始まった
クソニートなの
もうバレてんのに いや、いうか躊躇はしてたけど、あんたがそういうのを言い出しているんだけど
さすがに>>371は>>372のことを言っているようで、堪えられなかったw え? テレタイプ(TeleTYpe)がどうしたって? 半角くん、こっちにいたのか。
よかったら「cursorライブラリ」のことを教えてくれないか?
curses なら知ってるんだが、俺は無知なんだ。 ウィンドウサイズ変えてもCOLUMNS LINESに正しい値が入ってるのは
親プロセスである対話的シェルがSIGWINCHハンドラで設定してくれてるからでしょ。
太古の昔の商用UNIXの/bin/shは設定してくれなかった気がする。
現代でも親プロセスがシェルじゃない場合には、
正しく設定されてない可能性がある。
まあシェルスクリプトならCOLUMNS LINES がもし設定されていれば
それを使えばいいとは思うけどね。 ていうかCOLUMNS環境変数とかは設定されるべきとの勧告があるのか。 シェルスクリプトで引数を取り扱ういい方法はないでしょうか?
getoptとかgetoptsがあるのは知っています。
ですが、例えば cp みたいに、cp -a a b とかけるが
cp a -a b や cp a b -a というふうにオプションの順番を入れ替えても動くとか
gitみたいにサブコマンドが使えて、
git --no-pager log --stat のように--no-pagerはgitのオプション、
--statはlogのオプションみたいにする方法がよくわかりません
頑張ればできると思いますが、複雑になりそうです。
なにかいい方法はないでしょうか?
なお他言語を使うとか言うのは禁止です。 忘れてましたが、 ls ーal でも ls ーla みたいな書き方にも対応したいし、
git --exec-path=path でも git --exec-path path でも良かったりとか
git --exec-path でもOKとか、みんなどうやって引数解析してるんでしょうか? みんなは頑張ってやっている。
頑張らないでやる方法は他の言語とライブラリを使う。 あなたとしてはgetopt(1)はシェルスクリプトとは別の言語ではないのかな?
思いきり外部コマンドなんだけど……。 POSIXできまっていて、どの環境にも入ってるものならOKです。 Cで書かれたものを例に出している時点で変だけどな。それで他言語を使うとか言うのは禁止とか
まあ、シェルスクリプトでも頑張ってる人はググればすぐ出てくるな オプション解析とはまったく関係ないんだが
確かこのスレかその前あたりでaliasの可能性について論じてた人がいたよね
あれどうなったのかな。個人的にすごく興味がある。 >なお他言語を使うとか言うのは禁止です。
ずいぶん偉そうだね ロングオプションはgetopt_longでかなり幸せになっているよう。POSIXには(まだ)入っていない
gitは、まあ、大変。読む気は無くなるw
https://github.com/git/git/blob/master/git.c
CではCでも >>388
何が終了なのかよくわかりませんが、
getoptを使えなんて言ってないですよ?
少し考えてください。 >>393
もうちょっと勉強したら?
俺 学部生だぜ? ガキに知識で負けてくやしいよね?
OpenGroupっていうのはさ POSIXを制定している企業なんだわ。
つまりそこがPOSIX標準を定めてるってこと。
だからgetopt(3)はPOSIXに準拠したオプション解析器ってことだ。
どう? 理解した? これでも分からなきゃ相当 馬鹿 だなお前は。 そうムキにならんくていいだろう。>>393なんて人はいない、ネタネタ >>395
いや、知ってるけど、何にレスしてるのかわからん。
あー、>>382の
> シェルスクリプトで引数を取り扱ういい方法はないでしょうか?
> getoptとかgetoptsがあるのは知っています。
↑この行が見えてなかったのか。
だから「getoptってのがあるで(ドヤー)」って
書き込んだのね。そういうことか
あのね、getoptだけを使っても、gitのような複雑な
オプションを解析するのは大変なんだよ >>387
> Cで書かれたものを例に出している時点で変だけどな。
それな。C言語の話もしてないのに、
なんでそれ持ってきたのかもわからん
なんか根本的なところで勘違いしてる気がする。
まあ所詮学生だしな >>398
ww ズレすぎ。あんたのようなヤツなんていない。いたら怖いわっw
いちおう、念のために言っておくと、その引用されたのはあんたに対してだよ >>399
え?なに?つーことはお前もずれてるじゃん
gitのようなオプション(つまりgitは例)を
シェルスクリプトで解析するって話なのに
なんでgitはC言語でかかれていますーなんて話になるの?
意味がわからんが、説明できる?
(学生さんは図星だったようでだまっちゃったみたいだけどさw) Cで書かれてるのを例に出してるんだから、Cでまずはだろう。そこすっとばして、どうやってんのシェルでって意味通じないよ
てか、ちょっと素が出てきてるねえって感じ。ご苦労さん。なにしたいねん >>401
>>382で真っ先に
> シェルスクリプトで引数を取り扱ういい方法はないでしょうか?
> getoptとかgetoptsがあるのは知っています。
って書いてあるんだが、どこからC言語の話が出てきたの? もしかして、オプションの例として、gitのこういうオプションを
シェルスクリプト取り扱いたいですって言ったから、
C言語の話をしてると思ったの? マジなのか?うそだろーw
>gitみたいにサブコマンドが使えて、
>git --no-pager log --stat のように--no-pagerはgitのオプション、
>--statはlogのオプションみたいにする方法がよくわかりません
gitのをしたいんでしょ?する方法がよくわかりませんって、Cでやってるとこを言っているんでしょ?
ロングオプションにしたってそう。Cでやってることをどうやってるって聞いてんだから、Cの話だろうに
あえてあんたよりにすると、「シェルで実現するにはどうしたらいいですか、または、可能ですか?」だな > gitのをしたいんでしょ?する方法がよくわかりませんって、Cでやってるとこを言っているんでしょ?
だからgitがCでやっているようなことを
シェリスクリプトでやりたいんですが?
> Cでやってることをどうやってるって聞いてんだから、Cの話だろうに
Cでやってることを(シェルスクリプトで)どうやるって聞いてんだから、シェルスクリプトの話だろうに
あと>>2を読もう
> ・シェルスクリプトのことをシェルってゆうな
はぁ、レベルの低いやつに目をつけあられたな
日本語もろくに理解できてない ああ、応えは応えてるからね
>>387 のググればすぐ出る
>>392 Cでやってることを頑張ってシェルだ書けば
ね > 頑張ればできると思いますが、複雑になりそうです。
と書いてるのに、
複雑になるのが嫌だということも読めていないようだ
Cのコードがシンプルならまだしも、複雑なものを見せて
シェルスクリプトでもCのまねして書け。複雑に書け
とか、全然答えになってないですわ >>405
> ・シェルスクリプトのことをシェルってゆうな
ああ、すまん >>408
ww やっぱり、ネタだな。いないだろう、そんなレス書ける思考のヤツはw
なにしたいねんっ ん?まさかと思うが、git "みたいな" オプションを使いたいって話を
例だとわからずに、本当にgitのオプションをそのまま扱うとか
勘違いしてないか?
一行目に
> シェルスクリプトで引数を取り扱ういい方法はないでしょうか?
と書いてあるから、間違うわけ無いと思うが?
> gitみたいにサブコマンドが使えて、
と書いてるのに「みたい」って文字を見逃して、
まんまgitのオプションを扱う方法だと思いこんで、
gitのオプション扱うなら、C言語のソースみればいいだろとか?
うわー、そう理解してしまうのは本気でやばい。ダメな方に意味でやばい 仕切り直すわ。なんでこの文章で理解できないのかわからないが、
ちゃんと補足する。
シェルスクリプトで引数を取り扱ういい方法はないでしょうか?
getoptとかgetoptsがあるのは知っています。
くり返しいいます。
getoptとかgetoptsがあるのは知っています。
ですが、例えば cp みたいに、cp -a a b とかけるが
cp a -a b や cp a b -a というふうにオプションの順番を入れ替えても動くとか
(もちろんcpは例です。cpみたいなと言ってるわけで、cpのオプションを
扱いたいなんて言っていません)
gitみたいにサブコマンドが使えて、
git --no-pager log --stat のように--no-pagerはgitのオプション、
--statはlogのオプションみたいにする方法がよくわかりません
(もちろんgitは例です。gitみたいなと言ってるわけで、gitのオプションを
扱いたいなんて言っていません)
頑張ればできると思いますが、複雑になりそうです。
(gitのC言語のソースのような複雑なコードは書きたくないです)
なにかいい方法はないでしょうか?
なお他言語を使うとか言うのは禁止です。 >>397
「知っています」(ただし使えるとは言っていない)
だろ? どうせ。
gitのオプション解析のソース覗いてみろ。そして俺にあやまるがいい gitの話はしていません。オプションの話をしています。 だいたいgitがどうやってオプション解析してるかも知らずに
よくもまあぬけぬけと「getoptは使わない方針で」と言えたもんだな
いままでそんなゴミみたいな思考回路で生きてきて恥かしくないのかね >>415
>そして俺にあやまるがいい
なんかウケたww
>gitのオプション解析のソース
見たらしいよ。ものすごい文句言われたw >>416
おまえがgitの例を執拗に提示したから悪いんだろ
シェルスクリプトでオプション解析する方法はあるが教えてほしければまず
自分の不手際を謝罪してからにしろ >>418
>>414には「getoptを使わないで」
などと書いてないんですが、本当に日本語がおそまつ・・・ 不手際ってなんだろう?
>>414になんか足りないところでもあるの? あーあ。
オプション解析なんてみんながやってることで
そしてそのノウハウもかなり溜ってるんだから
質問の仕方さえ間違えなければすぐさま希望する答えが手に入ったのにね
もったいない
お前のような人間はこれからずっと人生負け組だよww >>423
お前に足りないのは脳味噌と他人に対する配慮だよボケ >>425
ふむ?なぜかバカにされたと思って、
それでムキになってるのか? 他板でもそうですが回答側がアレですねw
夏休みで低年齢層が増えていたからでしょうか。 IDやワッチョイのつけられる板に越してきた理由が、
こういう感じの無意味な応酬が目に余ったからだしな。
知性はあっても子供だよね。
IDがあってホント良かったよ。 >>414
頑張って下さい。
ま、しかし、bashだと素のshよりはちょっと楽かな? シェルスクリプトで引数を取り扱ういい方法はないでしょうか?
getoptとかgetoptsがあるのは知っています。
頑張ればできると思いますが、複雑になりそうです。 getoptとかgetoptsで頑張るのがいいと思います getoptとかgetoptsで頑張るのがいいと思います getoptとかgetoptsで頑張るのがいいと思います getoptとかgetoptsで頑張るのがいいと思います 良いプログラマーとは、楽をする為に労力を惜しまないそうです
今回はその労力をここでの問答に費やす訳ですから
粘り強く頑張って頂ければ良いのかなと思いました ム版に引っ越してきたばかりにム版の厄介者にいつかれちまったな まぁIDすらなかった頃に比べれば顔真っ赤が判別できるのは助かるわ しかし引数解析ってそんなに頑張らなくても自作できるよなあ。面倒なだけで。 引数解析って
prog -abcde
とかもできるの?
prog -a -b -c -d
とかしかできないの? >>450
普通にできるてかしてくれる。てかそれぐらいちょっと調べればわかること ちょっと調べたけど
https://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb
ロングオプションが使えないgetoptsか
--longと書いたら-oと誤爆するgetopsしか
見つからなかった
「普通にできる」とはどういうこと? > --longと書いたら-oと誤爆するgetopsしか
--は先に除外すればできるか。リンク先のコードではダメだけど
あとgetopt。これはbashだから、caseの二段構成にするしかないんかな
これを「普通にできる」とは思わんけど getoptはGNUとBSDでは別物。GNUのはロングオプションに対応してる。誤爆って?
getoptsはKorn/POSIX シェル組み込みコマンド(らしい)。ロングオプションは使えないが>>450を「普通」にやってくれる
ロングオプションと羅列を混同してるのか?? やっぱりデメリットあるのか。
ロングオプションが使えないのはだめだね
できるけど、べつのことができない 例えて言うなら、ケーキ食べられる?って聞いて
普通に食べられる(だけどパンは食べられないけどね)
みたいだなーってことだよ
確かにケーキ食べられる?が質問だし、食べられるのだろけど
それ以前のできて当然のものができないっていうのは
がっかりするしか無いなぁってこと トンチキが横入りして勝手に俺の思ってたのと違うっていうのか。知らんがな こういうふうに、話の流れから当然だろ?と思うことも
いちいち全部言わないと、話ができないってのは
アスペなんだろうなって思う それはあんたの勝手な話の流れの解釈だな
俺は、>>450は今までとは違う初心者のぶっ込みでしかないと思うけど。ある意味新たな
てか、本題はもう終わってるだろう?あんたの勘違いでwそれを認めたくなくダラダラなだけだな >>463
なんか自分が初心者の質問を解決してあげたみたいに思ってるかもしれないけど、
getoptでそれができるよ(ただしロングオプションは使えないよ)って
教えてあげたのは俺だからね
あんたは普通にできるといっただけで、どうやってできるとは言ってない。
getoptという名前を出すと、すぐにロングオプションが使えないことも
わかってしまうからね。制限付きであることを隠したいから、名前を出さずに
普通にできるという言葉でごまかしたんでしょう? >>464
解決してあげたww。次の文とかからもそこが大事なのねwなるほど
俺は別にお前のように俺が俺がというのはないなあ。単なる雑談の一種でしかないな
なので、お前のその言っていること全体がイミフメイ。妄想するのは勝手だが、妄想をダダ漏れさせてぶつけられても困ります。あとは勝手にやっとくれ 暇なのは否定しないが、雑談の「一種」と言っているのだけどな
すんなっていってるそれも雑談じゃないの? >>453 >>464
都合のいい先走った解釈はされないほうが。
>>450 ではロングオプションのことはきいていないですよ。 >>472
そんなんだからアスペって言われるんだよ ひらめいた!
prog -abcde
を引数解析するには
prog -a -b -c -d -e
に変換すればいいんじゃね?
【お題】
prog --foo -abcde --bar param
を
prog --foo -a -b -c -d -e --bar param
と実行したように見せかけるにはどうしたら良いか? >>474
getopt(1)を一度でも使えばそんなお題を出さずにすむのに バッチはシェルではないけどMSDOSはシェルなん? >>478
MS-DOSはWindows以前に使われていたCLIベースのOSの名前
MS-DOSではcommand.comというシェルが使われいていた
バッチファイルはcommand.com用のシェルスクリプト
バッチファイルはバッチ処理を行うために使われていたシェルスクリプト
Windows 9x系でもcommand.comは存在しDOSプロンプトとも呼ばれる。
16bitアプリケーションでありMS-DOS互換環境を提供する役割もあった
Windows NT系ではMS-DOSが完全に廃止され、DOSプロンプトから
名前を変えてコマンドプロンプト(cmd.exe)が標準のCLIシェルとなった。
(32bit版では互換性のためにcommand.comも残っているが
NT系はMS-DOSが存在しないため、実行環境はWindows 95と大きく異なる)
まとめると
MS-DOS、Windows 9x(95, 98など)、Windows NT(XP、7、10など)がOSの名前
command.com、cmd.exeがシェルの名前
拡張子 .bat .cmd のファイルが、バッチファイル
バッチファイルで行う処理がバッチ(処理)
シェルでバッチ処理を行うためのスクリプトがシェルスクリプト 録音してゆっくり再生してようやっと何言ってるかわかる、ぐらいかな >>481-482
本当に自覚してないようだから教えてあげるけど
そういうくだらない雑談をよそでやんなさいって言ってんの。
それともそのレスになにか価値があるというのなら
どうぞいってください。話を聞くよ? このスレは君が価値を感じる書き込みをしなければならないスレではない。 せっかくプログラム板に移動したのに、荒らしは消えないのねw どういうぎゃぐなのかと思わせられるほどの無自覚ぶり。他人に自覚とか言ってるのに )ソ)
ッλ ノ(.,ノ)
(゙- ..::.::. . (
(ソ. .彡⌒ミ. )ソ)
).::'; (´・ω・`) ス (
ソ .::;';'(つ ⊂)::;';'`〜、.
( :;';' |__∧_| ::;';' ヽ)
`'~`'''`'`'`~'~~`~~'`'`''''"`'`'`''`''''"`'``'~`''`'~`'''`'`'`~
さ あ 禿 げ 上 が っ て ま い り ま し た ファイルの更新について教えてください
フラッシュメモリ(SDカード)にファイルを保存しています
ご存知のようにフラッシュメモリには書き換え回数があり
使いすぎると壊れるのですが
シェルでリダイレクトして追記していく形にした場合
追記分のブロック数分が更新されると考えていいのでしょうか
もしくは100バイト追記してもファイルの大きさが100MBあったら
ファイルシステム上再配置されて
フラッシュメモリ上は100MB相当(のブロック)の更新がかかりますか?
またviなどのエディタで更新した場合はどうなのでしょうか?
やはり100MB分の更新になりますか? >>493
OSやドライバに依存する。
でもだいたいはライトキャッシュがあって実際の書き込みは中々されないと思うよ。
ましてや書き込み回数が多くなると劣化するメデイアと初めからわかっているものに対してバンバン書くようなことは普通のドライバならしないと思う。 この動きって仕様ですか?
No1と同じような動きを$@を一旦別の変数に入れて
実行したいのですがなにか方法はありますか?
./test.sh "a 1" "b 2"
# No1
for i in "$@"; do
echo $i
done
# a 1
# b 2
# No2
args="$@"
for i in "$args"; do
echo $i
done
# a 1 b 2
# No3
args="$@"
for i in $args; do
echo $i
done
# a
# 1
# b
# 2 >>495
仕様だと思う。
$@の時点ではシェルが解釈した引数ごとに分かれているのに対して
"$@"←のようにしてしまうとそれがひとまとまりに見做されてしまい
結局args="a 1 b 2"と代入していることになる。 解決方法はevalやらを使って
#! /bin/sh
n=1
for i in "$@"; do
eval "arg$n=\"$i\""
n=$((n + 1))
done
こうやるといいんでは。
arg3とかで「3番目の引数」を参照できるようになってる筈 ていうか質問の内容から察するに二種類の別の引数を処理したいんだよね?
すなおにPythonとか使ったほうがいいとは思うが……
俺が示したやり方だと引数の位置が絶対参照だし 引数を処理する度に変数が衝突するし
もちろん俺の方法が下手というのもあるが まあシェルスクリプトで引数処理は鬼門であることは間違いない どう解釈すれば、この挙動を理解できますかね?
./test.sh "a 1" "b 2"
for i in "A $@ Z"; do
echo $i
done
# A a 1
# b 2 Z
for i in "A Z"; do
echo $i
done
# A Z >>493
シェルの追記はかからない。
vi/vim はかかる。
>> 495
仕様。配列にぶっこむ。
HOGE=("$@")
for ent in "${HOGE[@]}"; do
echo $ent
done >>499
"A $@ Z" → A\_a\_1_b\_2\_Z
"A Z" → A\_Z
アンダースコアはスペースと思ってくれ。
ダブルクォートはスペースをエスケープしてる。
man に載ってたと思って読んでたが見つからんかった。 man の特殊パラメータの項に書いてあるのはこういうことか?
"A $@ Z" → "A ""$@"" Z"
確かに動作は同じだ。
試したコードはこんな感じ
for i in "$@"; do
echo $i
done
for i in "A $@ Z"; do
echo $i
done
for i in "A ""$@"" Z"; do
echo $i
done よくわからんね。 $@がダブルクォートの中に入ってたら
"$1" "$2" ・・・ "$n" に展開されるってことかな?
でもそれだと
# A a 1
こうなる理由がよくわからなんのだよな
"A $@ Z" は
"A $1" "$2" "$3" ・・・ "$n Z" に
展開されているとしか思えない >>495
IFS="\n" を設定すると No3 は
a 1
b 2
>>499
IFS="\n" を設定して
args="$@"
for i in A $args Z; do
echo $i
done
ならば
A
a 1
b 2
Z
となりました >>503
あ すまんこっちか。
>>497じゃだめなの? イイかダメかで言えば、arg1、arg2、arg3、・・・では
ループできないのでこれだけではだめですね。
シェルスクリプトにもライブラリが欲しい所ですね そんなもんいらない
そんなん使うぐらいなら別のスクリプトを
シェルから使う
ホントな頭悪いことばっかりいってるわ >>507
もう何度も言ってるが別の言語を使え
お前は家で生ハムを作ろうとしているようだぞ
素直に店で買ったほうが旨いし危険性も少ないぞ 最初は使い捨てだからとシェルスクリプトを書くが
なんだかんだ使い続けて、利便性向上の為にアップデートを続け
最後には複数ファイルに及ぶ意外に大規模な代物に
今更マトモな言語で作り直すのも面倒臭い
やるなら最初からマトモな言語で作っておけば良かったと >>510
その通り
一部のよほど頭の良い人(USP研究所とかそのあたり)じゃないと
まともに扱えない単純だけど難しい言語
ほとんどの人間はPythonやらを使ったほうがいい
Pythonはエラー処理やセキュリティ関連も既定で充実してるから
バカでもプログラムが書けるようになってる シェルスクリプトを他のスクリプトへコンバートするツールとか無いのかな? >>510
シェルスクリプト使うのは、
シェルスクリプトでやるのが適している場合で
規模で決めるもんじゃないだろ? >>513
規模で決めても変わらんだろ
シェルスクリプトに向いてなければどーせ規模が増える 例えば、rbenvとか、それなりの規模だけど
シェルスクリプトで作るのが適している >>493-494
>追記分のブロック数分が更新されると考えていいのでしょうか
たぶん、追記分だけ
ページサイズが4KB で、20KB のファイルがある時、
追記すると、最初の5ページに変化はない。
6ページ目が追加されるだけ
ただし、ファイルの中ほどを更新した場合は、どうなるかわからない。
3ページ目だけを更新した場合、1, 2, 4, 5ページに変化はないけど、
3ページ目のサイズが大きい場合、6ページ目を確保して、それを間に入れるから、
1, 2, (3, 6,) 4, 5 のようなページの並びになるのかな?
まあ、ファイルシステムの説明を読まないと、わからない vagrant, chef は、Ruby で書かれているだろ
大きい手順書を、シェルスクリプトで書くのは、途方もない! ・テスト環境……なし
・ドキュメント生成……なし
・バージョン管理……なし
・パッケージシステム……なし
まあそりゃ大規模開発には向かないわな。
やってもいいのは上記の諸々を自作できるような賢い人間。
(俺を含めた)普通の人間は「連番画像をDLする」とか「写真フォルダを整理する」
ときに一度限りのシェルスクリプトを書く程度に留めて
開発はPythonやRubyやJava(個人的に後者二つはあまり好きじゃないが)を利用するのが一番いい。
もちろん自身にとってもだが,他人にとっても不具合が少ないし事故が起こりにくいというのは大きな利点でしょうね。 >>517
シェルに関係ないツールなのだから当たり前では?
手順書がいつシェルに適していると?
rbenvは手順書じゃないよ >>518
それ理屈にあってないだろ
"作れない" ならともかく、現在ないから大規模開発に向かないという理屈なら、
あれば大規模開発に向いているって言うことになるぞw
例えば、今はsystemdに役目を移してしまったが、
Linuxの起動の仕組みはシェルスクリプトだった。
ちなみにgitも結構シェルスクリプトが含まれているよ
https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh
それにテストもドキュメントもバージョン管理もあるね。
(って今気づいたがバージョン管理ってなんだ?) なんか、JavaScriptと同じ空気を感じるな。
いろんな仕組みがないから、簡易的な用途にしか使えないと
最初は思われていたが、それらの仕組みが揃った今では
サイト全体をJavaScriptで作るのもありえないことではなくなった。 >>515
前提条件なしのインストーラーみたいな選択肢が他に挙がらないパターンは違うだろ
適してるかどうかで考えるってのは誰も否定せんわ
篩や目安として考えるのが規模だって話だろ >>522
だから規模で判断するのは間違いという結論になると言ってるんだが? >>523>>525
それは例外であって反例ではない 仮想化は、典型的な手順書だろ。
パッケージをダウンロードして、インストールして、環境変数PATH を通して
シェルスクリプトで作るのは面倒。
Ruby でOK まあRubyじゃなくてもRubyのように
ドキュメント生成やパッケージ管理ができればいいんだよね
PythonがいいよPythonが。 >>527
え?今求められてる「例」は
「シェルスクリプトが適している物」でしょ?
いつの間に質問が「シェルスクリプトが適さない物」にすり替わって、
rbenvを「例外」としてだしたと思ったの? >>528
> 仮想化は、典型的な手順書だろ。
たまたま手順書がシェルスクリプトで書かれていたからって、
手順書だからというのはシェルスクリプトで書く理由にはならないんだよ。
あんたはrubyが入ってない、入れたくないという環境でも
動かしたいという理由とごっちゃにしてるだけ 理解したならいい。
好きにするのは普通にしている。
ここでやってるのは、お前に理解させることだからな。
反論がなくなればそこで終了だ >>531
Unix に新しいシェルが!? と思ったら PowerShell だったのね 結局どういう場合にシェルが適しているのか一言も言ってない件 >>526
1. シェル環境そのものをカスタマイズするためのもの(例 rbenv)
通常のプロセスはサブプロセスとして起動するので、カレントシェルのカスタマイズはできない
2. 特定の言語のライブラリやランタイムに依存したくないもの(例 Docker)
あらかじめ入っているものだけで起動できるので、環境を整える必要がなくなる
コンテナやIoTといった小さな制限されたイメージでも使える
逆にさ、他の言語の方こそ「適している理由」が少ないと思うな。
例えばRubyで作ったものはPythonで作ることだってできるだろ? 3. CLIコマンドとCLIコマンドのグルー言語
リダイレクトやパイプを使った処理はシェルスクリプトが得意
他の言語でもネイティブに記述するのが面倒だからか
内部的にシェルを経由してたりするしな >>537
1はそもそも対象となるものが少ない
2は例えばC#ですら可能 >>539
はぁ、だから
> 逆にさ、他の言語の方こそ「適している理由」が少ないと思うな。
> 例えばRubyで作ったものはPythonで作ることだってできるだろ?
こう書いたのに。
たとえ対象となるものが少なくとも、
適している理由があるだろ?
他の言語は、その適してる理由すらないのにって話だよ
2がC#ですら可能? じゃあ俺が使ってるルータ(OpenWrt)で動かしてみなよ 参考までに言っておくと、俺が扱ってるルータは
比較的スペックが高いものだが、Flashのサイズは16MBしかなく
ファームウェアを除いたら空き容量は10MB程度だからな 自分が今使ってる環境を前提にして
同じように考えろと周りにも要求する人ってたまにいるけどその議論に意味あるのか? >>542
意味ないだろうね。
だから sh しか入ってない、入れられない
環境っていうのも考慮しろ。
贅沢な環境を前提とするのは
大間違いだって言ってる。 >>543
だからって極貧環境を前提にするのも間違い
極貧環境でリッチなスクリプトが動かないのはわかった
その環境ではshは素晴らしいものだ
スクリプト言語の完全敗北だよ
そりゃ動かせないのに勝負になるわけない
この結論に議論の余地はないだろう
じゃあ議論が終わったので次に行こう
業務規約でツールインストール禁止のWindows 7環境でshのメリットはあるか? >>544
はぁ。前提としてねーだろ
そういう環境もあると言ってるだけなのに、
「無視するのが前提」で話をしてるのは
お前なんだよ
これからは「考慮するという前提」でいくからなw >>542
意味ないね
そもそも根本的に考えてることは同じハズなんだが、イメージ対象が違ったりアスペみたく妙なとこ拘り始めると話が拗れる >>544
> 業務規約でツールインストール禁止のWindows 7環境でshのメリットはあるか?
WindowsとLinuxの両方で使うなら、
両方のOSでそのまま動くツールがほしいね
まずツールインストール禁止なんだから
任意のバイナリ、RubyやPythonをインストールすることは禁止だ。
(バイナリOKならbusyboxでもダウンロードすればいいということになる)
だからバッチファイル or PowerShell or JavaScript(JScript) と
シェルスクリプト の二段構えにするしか無いだろう。
二重にコードを開発するのが嫌なら、簡易インタプリタ言語でも作って、
WindowsではJavaScrptで、Linuxならシェルスクリプトで
パースしてコマンドに変換して実行とかかな
ってことで、シェルスクリプトでもそういう用途のために
ライブラリとか充実してるといいよねという話に戻すw 皮肉が伝わっていなそうだから言っておくが、>545は
「どちらもなにかを前提としてる」だろってこと
そして2つの違いはその前提が
「多くの環境に対応する」前提 なのか
「特定の環境を切り捨てる」前提なのかってこと 最近知ったけど&&や||使えばifによる判定不要なんだね
ls aaa && echo exists
ls aaa || echo not exists
でもプログラムやってきてた自分としては
if使っちゃうかなあ・・・ > でもプログラムやってきてた自分としては
???
俺もプログラムやってきたが、こういう書き方を知った(意識した)のはperlが最初だな
http://perldoc.jp/func/die
> chdir '/usr/spool/news' or die "Can't cd to spool: $!\n"
(or は優先順位が違うだけで || と同じ)
以降Rubyや
https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html#or
> demo || die
> demo or die
JavaScriptでも使うようになった
https://stackoverflow.com/questions/51206667/or-in-ternary-operator-using
> (a === 0 || b === 0) && console.log('aloha amigo')
(Perlよりも前にやっていた)C言語でもできたんだが、当時は使ってなかったな。
https://qiita.com/gyu-don/items/a0aed0f94b8b35c43290
> a || error(); // if(!a){ error(); } のような挙動
> a || (a = 1); // if(!a){ a = 1; } のような挙動(代入が式である言語で有効)
こういう書き方ができないのはVBぐらいじゃないか?
VBは短絡評価じゃないから、先に|| や && の右側が評価されてしまったはず
えーと、いつから自分がプログラムやってきたと錯覚していた? >>516
> 1, 2, (3, 6,) 4, 5 のようなページの並びになるのかな?
重複排除以外ならない。
アプリからそれを書き込もうとすると
write(fd, buf/*3, 6, 4, 5*/, size)
を実行するしかない。
>>549
向いていない。 >>555
> 向いていない。
理由もお願いします。
解決可能な理由だと意味ないですから 何行以上なら大規模なのか、1人で開発したら大規模と言えるのか。
シェルスクリプト環境自体がシェルスクリプトを用いた大規模分散開発の成果と言えるのかもしれない。
という夢を見た >>557
ありがとう。やっぱりうちのOpenWrtでは動きそうもないね。 >>560
最初に思ったのが、glibcではないから。
たしかuClibcだっけ?と思ったが、musl libcに変わっていた。
glibc互換らしいから動くかもしれない。
次に思ったのがCPU。うちのルータは MIPS
ここを見るとARMはあるがMIPSはないのでアウト。動かない
https://www.microsoft.com/net/download/dotnet-core/2.2
おまけでARMのコアバイナリサイズ。圧縮状態で30MB近くある
展開したら60MB?。空き容量は10MBしかないので到底入らない。
ちなみにOpenVPNとか入れるんで10MB全部使えるわけじゃない
USBメモリを使うという裏技があるから不可能ではないが。
あとは使用メモリも気になるな。高スペックルータなので、
128MB"も"搭載されているが、どれくらいメモリ食うんだろうね 訂正
× おまけでARMのコアバイナリサイズ。圧縮状態で30MB近くある
○ おまけでARM版の.NET Coreランタイムのバイナリサイズ。圧縮状態で30MB近くある ちょっと理解に苦しむんだが、ルーターで大規模開発するわけ? ちっちゃいコマンドを一杯つくって
そのコマンドを一杯組み合わせてどんどんコマンド作るのには最適
標準入出力でひたすら組み合わせて使えるのがベストだ
一つのシェルスクリプトでたくさんの機能の処理を書こうというのが
そもそもの間違い
単体のシェルスクリプトで完結して使える簡単な機能を作る
わかりましたか >>563
俺も理解に苦しむな。
だれがルータで大規模開発するなんて言ったんだ? >>564
いやわからんw
「簡単な機能」とはどういう機能なのか
理論的には、たくさんのコマンドを組み合わせるだけという
シェルスクリプトに適した単純な機能であっても、その量が多くなれば大規模になるだろう?
「機能の種類や複雑さ」と「機能の量」は別々の概念だ
俺にとっては大規模といったら10万行超えるぐらいのものなんだが、
その前提でいいのであれば1000行程度は小規模だろう。だがその
1000行でもライブラリあったほうが楽になるだろうと用意に予測できる
例えばgit subtreeが865行だな
https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh シェルスクリプトが大規模に向いてないという理由を
誰も答えてくれないので俺が書いてやる
まず前提としてどんな言語であっても、言語だけでは大規模開発を
するのは無理RubyでもC#でもJavaであってもだ。
少し前まではJavaScriptも大規模開発に向かないと
言われていたはずだ。それが解決したのは何故か?
大規模開発をするのに必要なのは言語じゃない。フレームワークとライブラリだ。
どんな言語でも大規模開発するためにフレームワークとライブラリを使うだろう?
逆にこれらを使わないで大規模開発なんて到底無理だろ?
JavaScriptが大規模開発できるようになったのも、
フレームワークとライブラリが補完されたからだよ。
シェルスクリプトも昔のJavaScriptと同じ状況。
といっても俺はシェルスクリプトで大規模開発をすることには興味がなく、
せいぜい数千行程度の中規模ぐらいまでしかやることはないだろう。
何故かと言うと単にシェルスクリプトに適した内容で
10万行を超えるようなものが思いつかないからだ
だがそれはシェルスクリプトで大規模開発ができないということにはならない。
実際USPとかいうので、無印良品や東急ハンズのシステムが作られている(いた?)だろ
http://www.atmarkit.co.jp/news/200909/07/lltv03.html
https://www.hands-lab.com/tech/entry/62.html
(適してないとは思うが)足りない部分を補えば大規模開発だってできることは証明済みだよ
まとめると、現在のシェルスクリプトが大規模開発に向いてないのは
フレームワークやライブラリが不足しているから。
俺がシェルスクリプトで大規模開発をやらないのは、
シェルスクリプトが適した内容で大規模なものを思いつかないから。
それはそれとして中規模を小規模にするためのフレームワークやライブラリは欲しい。 コマンドラインインタープリタを自動化したもんを
シェルスクリプトとというの
頭悪いバカのみんな分かった?
頭悪いバカは用途がわかってない、、、 たとえばなこのスレにいるような
コマンド叩ける程度の知能しかないオペレーターみたいなヤツが
シェルスクリプトだったらいっぱい自動でコマンド叩けると
必死に主張してるワケ お、今気づいたが、git subtreeってそのオプションの多さに比べて、
コードが少し少ないんじゃないか?と思ったら、
https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh#L11-L33
OPTS_SPECを定義して、git rev-parse --parseopt つかって
何やらオプションを正規化してるんだな
gitにこんな機能があったとは
とは言え、劇的にコードが減ってるわけじゃないから
これなら http://docopt.org/ の方が優れてるな >>574
「コマンドをいっぱい叩ける」というのは量の話。
「適した用途」というのは量(大規模か否か)ではなくて
>>537-538に書いたような、処理の内容の話
いい加減、量にこだわるの止めません?w シェルスクリプトでじかに文字列の処理なんかしないからな
sedやawkを使っても
頭が致命的に悪いとコレもシェルスクリプトで書いてやりたいとなるわけか
なるほどな サマータイムスレにもいた半角使いのキチガイ野郎かな?
みんな、こいつの味方するの?w >>578
オプション(引数)解析の話を
ずーっと続けてますよw ム版来たせいで、ム版名物の半角君も長文君も呼び寄せちゃったか… >>568
理論って何?www
理論って言葉使いたくなっちゃったのかな?www >>583
その「長文君」がム板に来る流れを作った張本人という可能性は考えないのかい?w >>568
理論ってどんな理論なんだろう?www
プークスクスwww >>583,587
その二人ともなぜか 俺だけ 優秀と思っている不思議さwだから嫌われ者同士でも互いに嫌ってるのかww オレが優秀なワケじゃない
オマエが健常者じゃないだけだからな
まずそこを自覚しないといけない
そこを勘違いしたらダメなワケ
オツムに軽度の障害があるとみなせるぐらい知能に問題がある 別にそういう個別特定なのはいいのねん
お前には俺(のレス)がそう見えるというのはお前の価値観からそう見えるのはしょうがない
だがしかし、お前の場合はレス個別に対してじゃないのもあるからな。不特定多数のも。自称健常者は敵が多いからなのか??w wwww いや、笑った。すげえなww
低学歴 知恵遅れ 健常者じゃない と、どこのスレでもどのレスでもそういう言葉があるな。すごいなww
ちょっと頭のおかしな人が道中をぶつくさ他人に悪態ついてるのと似てると思うけどなあ。「健常者」なんて普通使わないと思うけど、もしかしたらマジ病気のひと?ww
普通に会話、普通のレスできないの?あったとしたらすまん、あまりにもあういうのばかりで見逃したかもw オレと会話したいの?
残念なことにな、知恵遅れとまともな人間のあいだでは
会話が成立しない
プロトコルが違う
オレと会話したいなら
まず相応のプロトコルを身につけてからだ 他スレで長文書いてたw まあ話は進んでないみたいだが
https://medaka.5ch.net/test/read.cgi/php/1474523013/854
https://mevius.5ch.net/test/read.cgi/hp/1533007852/229
今更だがsedって意外と便利に使えるのな。正規表現による範囲指定とか
s///使った単なる置換ぐらいにしか使ってなかった。
書いていたコードが短くなりそうで嬉しいw yesコマンドってPOSIXユーティリティじゃないのか……。 >>592
会話のためじゃなかった、なんの為に数々のレスしているの?君は
まあ、自己顕示欲承認欲求からだけだろうなというのは、数々のレスからは垣間見えるけど、そういうことなのね、そういうことでいいのねw この板をまともな板にするために
この板でレスしてる
オマエみたいな頭悪い低学歴知恵遅れが幅きかせて
いま、この板は正常に機能してない
低学歴知恵遅れは低学歴知恵遅れの自覚がない
しかも自己評価だけは高い
その分タチがワルイ
まともな人間が近寄らない
そしてその自覚すらない
その自覚がないから更生もしない
つまり更生することもないから排除しかない
つまりオレは
素晴らしく情報価値が高いレスを提供すると同時に
この板から低学歴知恵遅れのクソニート、底辺ITドカタを排除する作業を実施している
わかった?
まともな板にするためにな
ひたすらオレはレスをしている
わかった? やっぱり移動先はLinux板にしといたほうが
良かったんじゃねーの?w >>597
>この板をまともな板にするために
wwwww マジでっ!?
その言っているのは、いろいろ自分にも当てはまるだろうと思うんだけどな
自己顕示欲承認欲求と見なされるのは嫌らしいというのだけはわかったよw 「排除」www すげええええっwwww
いや、怖い...w >>595
これは yes って返せばいいのか!? どうでもいいけど、
yesコマンドって
1. なんに使うんだ?
2. なるほど(使いみちを聞いて)
3. いつ使うんだ?(使ったことがない) ← みんなこの状態だよな?w だいたい、-yオプションとか、-fオプションとか、-qオプションがあるからねぇ
おっとまたオプションの話だw
オプションついでにいうとtarとかpsってなんでハイフンなしで
tar czvf とか ps aux とか書くんだろう?
ちょっと調べたら昔の仕様?らしいけど
今はtar -czvf とか ps -aux とかできるみたいだけどさ。
まあ今はハイフンなしオプションのことを考慮する必要は無いだろうけど
それに対応したライブラリ(getoptsみたいなの)ってあるんだろうか? >>608
ないのでは? tar の場合はハイフンなしの Old style のオプション指定されていたら
まずはハイフン付きに置き換えてから解釈しているらしい。
https://qiita.com/junjis0203/items/6bb48184b508045e69da >>609
すごいな。一発で持ってくるとは
でもID:elP7igYWみたいな馬鹿を相手にするなんてもったいない……。 >>609
なるほど。
初期(いつ?)の頃ってコマンドの開発どうだったんだろうね
ハイフンなしのオプションはしばしば用いられていたのか?
どんなコマンドも最初の実装ってのは存在するわけで、
それが今とどう同じなのか違うのか少し気になってきた 俺、数百行クラスになったら静的言語にするから、
シェルスクリプトどころかrubyもpythonも使わない。
数百行にもなると書き捨てって規模じゃないし、
静的型検査なしで書くのは面倒くさい。
あとJavaScriptには現代的言語の持つ抽象化機能があらかたあるから、
連想配列も構造体相当品もないシェルスクリプトと同列に並べるのはJavaScriptに失礼。 シェルスクリプトでcのソースを書くのはちょっと面白い。 >>613
どういう意味?
メタプログラミングみたいな? >>612
大変やね。たまには数十クラス程度のものを作っても良いんやで >>615
そういう小規模なプログラムばかり書いてたらもっと動的言語を
使ってたかもしれないなあ。
就職して最初のプロジェクトがいきなり100万行オーバーのCプログラムの
大規模改造とかで、それ以後も数十万行クラスのプログラムばかり
触ってきて、ちょっと規模が大きくなると処理系の検査に頼る
習慣がついてしまった。 >>616
うん、仕事でしかプログラミングしてないんだろうな
ってのはすぐにわかったよ。
1から作ったことがあれば、いきなり数百クラスに
なることなんて無いからね
保守的な開発しかしたこと無くて、
小さなシステムの組み合わせで大きなものを作るという発想がない
古臭いものメンテナンスしかしたことないんだろうなと >>617
あれだけの情報で趣味プログラム書いてないってわかるなんてスゴイ⤴⤴
その推理フツーに間違ってるがw
そもそも小さなプログラムだって普通に書いてるし、だからこそシェルスクリプトスレに来てるわけで、
大きなプログラムしか書いてないとするとその時点で矛盾するじゃん。
自己矛盾した推理を前提に話を進めるとか、同僚にいたら困りそうなタイプだなあ。 >>618
いや、そもそもお前の発言が矛盾してるんだって。
↓これお前の発言な
> 俺、数百行クラスになったら静的言語にするから、
> シェルスクリプトどころかrubyもpythonも使わない。
数百行クラスになったら静的言語ってことは
数百行クラスになる前はどうしてるんだって話だよ >>619
> 数百行クラスになったら静的言語ってことは
> 数百行クラスになる前はどうしてるんだって話だよ
え、そこに矛盾はまったくないんだけど、マジでホントに分からないの?
明日の19時くらいまで待ってあげるから自分で考えてみた方がいいぜ。
降参すればもっと早く答を教えてあげるけど、こんな当たり前の話、ホントに分からないとするとそれはそれでまずい気がする。 おまいら、自分の書き込みが変に解釈された事の方を問題視しろよ。
相手が客だった場合、どんなに釈明しようが上司はお前が悪いとしか言わんぞ。 >>621
え、もしかして君も分からんの?
客ならともかく、プログラマーならこんなの分かって当然だと思ってたけど、そうでもないんかな。
まあ明日の19時過ぎたら答は書くよ。 上の方でもプログラマを自称しながら、アマチュアっぽいやつがいたからなぁw
まあ、明日なにか言おうとしてるみたいだから、何も言えなくなるように
大規模アプリを作るときの鉄則を言っておくよ。
まず大規模アプリを作るときに重要なのは細かくモジュールに分けましょうということ
モジュールという言葉の意味は文脈で微妙に異なるけど、きっちり定義したいわけじゃなく
小さなプログラム、小さなファイル、小さなクラス、小さな関数等に分けましょうという話
これをやっておかないと、例えばC言語のHello Worldであっても、
printfの複雑な実装を、一つのファイルに全部書かないといけなくなくなって
数百行なんてあっという間に超えてしまう
>>612は数百行程度で静的言語にするとか言ってるが、
俺に言わせれば、大規模アプリであっても"1モジュール(最小単位の関数)"で
数百行なんてめったになることなんてないだろうと。
まあ、どうせ >>612はプロジェクト全体で数百行と言ったつもりなんだろうが、
お前は単体テストできるようにしてないのかと。それぞれ独立して考えられるように設計しろよ。
小さなモジュールを組み合わせて作るんだから、プロジェクト全体の行数で考えるのは意味ないんだよ。
Hello Worldでもプロジェクト全体という話ならprintfの実装も含めなきゃいけない。
でもブラックボックスとして扱ってるんだろ? それと同じで自分で作る場合もブラックボックス化させればいいんだよ
つまり小さなモジュールに分けて作れば、静的言語でなくとも大規模アプリは十分作れるわけだ。
もちろんシェルスクリプトであってもね
もし「シェルスクリプトは上から下へ流れるように作るのが普通なんだ。
関数なんて作ってはいけない、複数のファイルに分けたりしてはいけない、複数のスクリプトに分けるのも禁止
だから大きなものは作れないんだ!それが世界の常識なんだ!!」という理屈であれば、
それは頭が固いお前の思い込みが、大きな物を作れない根本原因だろ。ってこと
結局プログラマを自称しているようだが、小さく分けるという設計ができない
アマチュアレベルの人間なんだろうって話だ やっぱり例の人だったかw
しかも長文の割に
(a) >>612が別に矛盾したこと言ってないと分かった
のか、それとも
(b) 相変わらず>>612が矛盾してると思ってる
のかを書いてないように俺には思えるというwww
>>623 よ、お馬鹿な俺に、君の意見が(a)なのか(b)なのか教えてくれ。 >>626
いや、別にお前にレスしてないしw
大規模アプリを作るときの鉄則を言っただけだし
明日の19時過ぎたら、なんか答え書くんだろ?
それを書いてくれればいいよ。
俺の文章読んで恥ずかしくないならね
まあ一つ言うとしたら、技術力の差ってやっぱりあるよな
他の人が動的言語できているという事実があるというのに
俺はできないんだ!ってよく恥ずかしげもなく言えるよなーと 大規模アプリを作るときの鉄則www
なんやろ?www そうだ、ヒントをやろうw
俺、(1関数で)数百行クラスになったら設計が悪い思って作り直すから、
数百行クラスになることはない なんか一つ一つが長文でここ最近ずっとだらっと最下部までスクロールして閉じるを繰り返してるわ これはアレですね。
(a)と答えると自分の間違いを認めることになって耐えられないし、
(b)と答えると明日の19時以降に赤っ恥を書くことになるしで、
(a)とも(b)とも答えられないってヤツですねw
分かりやすい。
自分の間違いを認めると死んぢゃう病に罹患中って奴だw 個々の簡単な完結した機能の簡単なシェルにしといたほうが
単体試験仕様書の設計も簡単
結合試験仕様書の設計も簡単
総合試験仕様書の設計も簡単
知恵遅れが作ると試験による検証すらできないシステムができあがる >>631
ん? 俺は間違ってないんだから、必然的に(b)ということになるな。
はい、明日の19時待ってますよw >>632
>>2を読め
>・シェルスクリプトのことをシェルってゆうな TypeScript・Haxe の違い
大規模開発なら圧倒的に、Haxe >>634
おまえ大規模アプリを作っとるんやろ?そうゆう初心者くさい事ゆうなよwwww
ちょっとだけ失望したわw すげーなこのスレ。
とうとうrubyガイジも呼び寄せたぞ。
オールスターじゃん 作業していて気づいたんだが >>537-538 の
どういう場合にシェルスクリプトが適しているかの話
少し毛色が違うが、コールバックの仕組みを取り入れるなら
必然的にシェルスクリプトで書かなければいけなくなるな
つまり
1. 簡単なことをやるためにシェルスクリプトを使う
2. だけど中身で一部複雑な処理があるので、そこだけ別コマンドを使う
3. その別コマンドから、シェルスクリプトに定義したコールバック関数を呼び出す
というようなことをやろうと思ったが、2の「別コマンド」がシェルスクリプト以外(正確には別プロセス)だと
シェルスクリプトに定義したコールバック関数を呼び出せない
つまりPerlで書くならば以下のような感じで、正規表現置換をsedコマンドで
実行してしまったら、(スクリプトの内部関数である)foo関数を呼び出すことができない
sub foo { uc($_[0]) }
$text = 'abcdefg';
$text =~ s/([a-c])/foo($1)/eg;
print $text; どうでもいいが(俺にとってはどうでも良くないが)
sedとawkとgrepとexprで使える正規表現のパターンが違うのって地味に嫌だなw
もし1から仕様を決められるなら、全部統一されるんだろうな。
HTML5みたいに一度足並み揃えた仕様にリセットされてほしい sedの非互換性も辛い・・・というかGNUが便利すぎなんだろうな >>641
最近知ったのだが、GNU awk に ARGIND という組み込み変数が
あってエラい助かった >>643も精神のという意味だろう。この読めなさはw sedで「command i expects \ followed by text」というエラーが出たが
なんか-iの話ばっかり見つかって、期待する答えがなかなか見つからないwww
GNUだと
echo text | sed 'i===' って書くだけで簡単に
===
text
と表示されるんだが、
BSDだと上記エラーがでて、しばらくどうすりゃいいの?状態だったw
持ってた sed & awk ポケットリファレンス 眺めても書いてあることがさっぱりでさ
正しく(POSIX)ではこう書かないといけないんだな。改行がいるとかw
echo text | sed 'i\
===
'
これを1行で書くために、改行を変数に入れるべくこんな変なことをしないといけなかったりw
LF=$(printf '\012_')
LF=${LF%_}
sedって置換機能以外の、本来stream editorとしてバリバリ使いこなそうと思ったら難しいな
ホールドスペース使いこなせる気がしない。何ができるのかも想像できないしw ホールドスペースをバリバリ使ってた。使いこなしてたかはともかく…
20 年以上も前のことだから、もうできない。 ホールドスペースやブランチを使いたくなったらsedやめて他の言語使えって、Macで女子高生が話してた。 sedがなんで分かりづらいかの理由がわかった
b(とt)の解説が悪いんだよ。
たいてい、b・・・無条件ジャンプのように書いてあるから
これだけでどうやってフロー制御すりゃいいんだよ?ってなる
正確にはこれ、条件分岐なんだな。ニュアンス的にはこんな感じ
/条件/b :label
bの前はアドレスってことだが、正規表現でもアドレス指定できるから
これを条件とすれば、条件分岐となる。
だけどアドレス(条件)はすべてのコマンドで使えるものだからなのか
そのコマンドの説明のところで省いてしまうから、解説だけを読んでも
ジャンプはあるが条件付きジャンプがねーじゃねーかってなるわけだ
条件文があるならあとは簡単だ。普通の手続き型のコードだわ "Commands which accept address ranges" って書いてあるやん… >>653
アドレスの範囲を受け付けますって遠く離れた所に書いても
それが条件として使えるとは気づきにくいって話 >>652
そこは、素人お断りですw よく読みましょう。
This is just a brief synopsis of sed commands to serve as a reminder to those who already know sed 19時過ぎたから答を書く。
言っておくがチョー当たり前のつまらん話だよ。
・短いプログラムは、シェルスクリプトやruby/pythonなど動的型付き言語で書くことが多い
・拡張していくうちに、これ以上長くなったら静的型付き言語で書いた方が楽そうだと思ったら、まるまる静的型付き言語で書き直す。あまり長くなると書き直しも面倒になるから、早めに手を打つ。
・長くなりそうだと初めから分かっている場合は、もちろん最初から静的型付き言語で書く
ってだけだよ。
静的型付き言語使いにはわりとよくある開発形態のはずだが、なんで>>612が矛盾してるなんて結論に至るのか。 とりあえずここまでレス飛ばしてきたんでまとめを頼む >>660
俺が>>612で
「数百行くらいのプログラムになると、俺の場合は静的型検査がないと面倒くさいので、静的型付き言語で書く」
と書いたら、いつもの人が例のごとく謎の難癖をつけてきたってだけの話。
別に「全員がそうすべき」って書いたわけじゃなくて
あくまで「俺にとっては面倒くさい」って書いただけなのに、どうも許せないみたいだな。
難癖は全然反論になってないので読む必要はない。 あ、>>612の「数百行クラス」ってのを
「(オブジェクト指向言語の)1つのクラスのコードサイズが数百行」と誤解されたようではあるな。
これは俺の表現も誤解を招くものではあった。
単に「1プログラムのコードサイズが数百行くらい」って意味で書いてたんだけどね。
まさかシェルスクリプトスレでオブジェクト指向のクラスのことだと解釈されるとは思わなかった。 >>612
興味本位で聞くんだが、数百行って具体的にはどの範囲をイメージしてる?〜500程度?
あと静的型付けって何使ってる? >>664
500行を越えるぐらいからかな。
常にその原則を守ってるわけでもなくて、不特定ユーザーに配布するスクリプトではBourne shellで3000行ぐらいのをメンテしてたりもする。
これは規模的に結構辛い。orz
言語は最近はCrystalを試してる。
まだ書き慣れたって段階には達してないけど。 >>665
俺は数百行って聞くと2、300をイメージするから、どのぐらいか気になった
crystalとは・・・俺は1.0も出てないものは使えんなあ
うちは処理結果が揮発で良いなら基本bash/pythonを使ってる >>659
やっぱり矛盾してるじゃんw
1. 俺、数百行クラスになったら静的言語にするから、シェルスクリプトどころかrubyもpythonも使わない。
2. 短いプログラムは、シェルスクリプトやruby/pythonなど動的型付き言語で書くことが多い
3. 拡張していくうちに、これ以上長くなったら静的型付き言語で書いた方が楽そうだと思ったら、まるまる静的型付き言語で書き直す。
では、長くならない場合は?
シェルスクリプトやrubyもpythonを使うんだろw >>665
> 常にその原則を守ってるわけでもなくて、不特定ユーザーに配布するスクリプトではBourne shellで3000行ぐらいのをメンテしてたりもする。
小さく分けようぜw
ファイルを分けたり、関数にすりゃ、
たった3000行なんて十分メンテ可能だろ >>663
> まさかシェルスクリプトスレでオブジェクト指向のクラスのことだと解釈されるとは思わなかった。
自分でrubyやpythonも使わないって言ったんだろw
自分でオブジェクト指向の言語だしといて何いってんだよ
結局最初に予測したとおり、大きな(それほど大きくもないがw)
プログラムを作るときの、小さなモジュールで作るってことを知らないだけじゃん >>667
> では、長くならない場合は?
> シェルスクリプトやrubyもpythonを使うんだろw
勿論そうだよ。
> やっぱり矛盾してるじゃんw
> 1. 俺、静的言語にするから、シェルスクリプトどころかrubyもpythonも使わない。
「シェルスクリプトどころかrubyもpythonも使わない」ってのが「数百行クラスになったら」に限定された記述だってことに気づかないあたりが君の鈍いところ。
初見で気づかないのはまあ元の文が多義的に解釈できるから仕方ないとしても、
この期に及んで気づいてないのは致命的かな。 >>668
> 小さく分けようぜw
> ファイルを分けたり、関数にすりゃ、
たった3000行なんて十分メンテ可能だろ
勿論分けてるよ。
シェル関数も使ってるし、1ファイル500行を越えるモジュールはない。
まったく同じようにモジュール化しても、静的型付き言語に比べて
動的型付き言語は人間にかかる負担が大きいってのが
>>612の趣旨なわけだが、君は相変わらずそのことに気づいてないんだな。
それなりのプログラマーであれば、動的、静的と言った瞬間にこの趣旨に気づくはずなんだが... >>672
(全てのプログラムは)長くなるからシェルスクリプトどころかrubyもpythonも使わない
って言っただろ?
長くならないプログラムがあって
「その場合はシェルスクリプトやrubyもpythonを使ってる」というのなら、
明らかな矛盾。使わないと言っておきながら使ってると言ってる。
>>671
負担が大きいから何だって言うんだ?
負担の大小ではなく、管理可能かどうかだろ
現実見てみろ。動的言語でも全体で何万行もあるシステムは作れている
お前が作れないのは単にお前の能力不足でしかない
その事に気づいたようで、動的言語では作れないんだというニュアンスから
負担が大きいに言い換えたようだが、バレバレだw
最初(>>623)に言っておいたとおり、プロジェクト全体の行数を考えるのは意味がない
> 小さなモジュールを組み合わせて作るんだから、プロジェクト全体の行数で考えるのは意味ないんだよ。
小さいモジュールのあつまりで作ればいいだけの話
小さいモジュールの集まりで作るから、
> 小さなプログラム、小さなファイル、小さなクラス、小さな関数等
は長くならない シェルスクリプトの話に戻すならば、
頭が固い人のたわごとは無視して、
複数のファイルで作れば良いってことなんだよ
もちろん、100行のコードと、
100行の10個のファイルだと後者のほうが
複雑だが(そりゃコード量が増えてるからな)
100行の10個のファイルの動的言語と
100行の10個のファイルの静的言語の
複雑度は変わらない 行とかいたら、コメント含めたりするかw
一応実行行(ステップ数)と言い換えておく >>676
さあなー。能力が低いのを言語のせいにしてるだけだしね。
そういや、連想配列がなかったらプログラム作れないと
言ってる人がいるがC言語には連想配列はない C言語に連想配列はなくても、誰かが作ったライブラリはある
そう考えると>>571の結論に戻る
> まとめると、現在のシェルスクリプトが大規模開発に向いてないのは
> フレームワークやライブラリが不足しているから。
> 俺がシェルスクリプトで大規模開発をやらないのは、
> シェルスクリプトが適した内容で大規模なものを思いつかないから。
> それはそれとして中規模を小規模にするためのフレームワークやライブラリは欲しい。 >>678
>誰かが作ったライブラリはある
それは具体的にどこにあるのですか?
それを見つけたとして、それを自分のプログラムに適用できるかどうか判断できるのですか?
単に(論理的に)存在すること、だけを言及しても意味がないと思いますけれども http://d.hatena.ne.jp/fd0/20080419/p1
glibc
言わずと知れた GNU の標準 C ライブラリ。search.h というヘッダがあり、
その中にハッシュテーブルを管理できる API が提供されている。
glibcなら誰でも知ってるだろう >>673
どうも君は健忘症みたいだから>>612から引用してあげるね。
> 俺、数百行クラスになったら静的言語にするから、シェルスクリプトどころかrubyもpythonも使わない。
「数百行クラスになったら」って書いてますね...
相手の発言を確認せずに「全てのプログラムは」とか言っちゃうの、仕事でやったら信用失うから今後は気をつけた方がいいと思うよ。
> 静的型検査なしで書くのは面倒くさい。
はい、「動的言語では作れないんだというニュアンス」なんて全くないですね。
動的言語だと「面倒くさい」って書いてるだけでした。
仕事でもこんな調子でコミュニケーションしてるのかなあ。
> 小さいモジュールの集まりで作るから、
せっかく「まったく同じようにモジュール化しても、静的型付き言語に比べて動的型付き言語は人間にかかる負担が大きい」って書いてあげたのに読めてないんだね。
モジュール粒度が同じでも、動的型付き言語と静的型付き言語では、人間の負担するコストに違いがあるんですよ。 search.h のハッシュ関数は別にglibc依存じゃなくてPOSIXだよ。
日頃POSIX POSIX言ってるけど、シェルスクリプトの範囲しか知らない人かな。 >>682
> 「数百行クラスになったら」って書いてますね...
だから矛盾してるんだよ。
「条件付きの結論」っていうのは、その結論(シェルスクリプトやRubyやPythonを使わない)が
正しいのはあくまで条件を満たされている場合であって
条件を満たさなければ、シェルスクリプトやRubyやPythonを使うということになる >>683
> search.h のハッシュ関数は別にglibc依存じゃなくてPOSIXだよ。
いつ俺がPOSIXじゃないって言ったんだ?
「glibcで提供している」と書いてあるブログを持ってきただけだろ >>682
> せっかく「まったく同じようにモジュール化しても、静的型付き言語に比べて動的型付き言語は人間にかかる負担が大きい」って書いてあげたのに読めてないんだね。
> モジュール粒度が同じでも、動的型付き言語と静的型付き言語では、人間の負担するコストに違いがあるんですよ。
だから、負担が大きいが、別に作れるだろって話
お前は極端なんだよ。規模が大きくなったときのことで悩んで、負担が大きいから使わないと
規模を大きくしなければ済む話なのに、それに気づいていない
まあ行数が同じなら、負担なんて大して変わらんがね。
動的型付き言語で大変なら、静的型付き言語でも大変 >>612の正しい日本語を書いておくよ
俺、数百行クラスにならないときは動的言語にするから、
シェルスクリプトやrubyもpythonも使う いや、IDがないともっと悲惨だよ、これ。
次スレはワッチョイもつけた方がいい気がする。 >>693
そういう可能性も考えて、元の板にも
スレ立てといたんだがねw
サマータイム導入に気をつけろよ
ローカルタイム使ってると同じ日時が
2回でてくることになるぜ 懸命に手を尽くしたましたが
手の施しようがありません やっぱり前スレの荒らしおよび、UNIX 板で後から意図的に重複スレ立てた人物だったんだね。
まあそうだろうとは思ってはいたが。 なるほどサマータイムスレであばれた低学歴知恵遅れの一部で
マジキチだったヤツか 迷惑なスレの乱立は
ID:ROt4XEkp の仕業だったんだな それは半角使うやつだろ
はっ!お前半角使ってるじゃん! >>703
前々からそうじゃないかと思ってたが、やっぱりでしたね。 >>705
実はもう一つプロバイダ持ってるw
そっちはホスト名調べても県名がでない
予備回線で昔(10年以上前)は大手プロバイダでも時々回線異常発生してたんで
持ってたんだけど、最近は使わないからやめようかと思ってるけどね
もう2ちゃんねるでスレ立てるするときにしか使ってないしw んで、元の板に戻るのかどうか?
俺はどっちでもいいよ ワッチョイ板でも書いたけど日付変わったらIPアドレス変更するよ!
攻撃しないでね!(まあやっても無駄だけど) (まあIPアドレス変わっても書き込み内容が独特なのでストーキングしていればすぐに分かる) これだけ荒らしておいて、まだUNIX板に戻る選択肢があると思ってるとは...
絶対に戻らないっことが、今回の
件でさらに強固になっただけだね。
そして ID:+CEwKGA5 はもう一つのプロバイダーを使った自演だったというわけだ。 まず馬鹿ガイキチには叶わないっていう如実なサンプルってことで、以後ID:ROt4XEkp とわかったら途中でも終了スルーでいいだろう 元に戻るってのはID無くすってことだぞ
全く解決になってない
解決ってのはワッチョイなりIPなり表示させることだ a="abc" から最初の一文字を削除するのは
echo "${a#?}" でいけますが、
この削除した文字を取得する方法ってないですよね? >>715
そのままだと多分ないな
今手元にkshしかないから検証は出来んがbashだったら
echo "${a:1}"
echo "${a:0:1}"
で代用したらどうだ bashはまあそれでいけますよね・・・
試しに文字列の長さを測って
(ループで空になるまで1文字ずつ消していけばわかる)
文字列の長さ-1個の??????・・・という文字列を作って
${a%????・・・} で文字列の後ろを削って1文字残す
というやり方でevalも駆使して取り出したけど、
このやり方で1文字ずつループさせたら
1KB程度の文字列で1秒かかってしまったw
これならたぶんsedで1文字ずつ改行させて処理したほうが速いだろうな >>716
ついでに聞きたいんだけど、手元にkshしかない状況ってどんな状況? ${a%${a#?}}
でいいのかな。dashでもとれてそう >>719
あ、いや、どんな仕事をしているのかという
Linux、Macではないようだから
どんなOSを使っているのかとか >>720
それでもいけるように見えるんだけど
aの中にa*bとか入れてみたら動かない
動くパターン
a="abc"
echo "${a%${a#?}}"
=> a
動かないパターン
a="a*b"
echo "${a%${a#?}}"
=> a* >>723
なるほど。そっち系はよくわからないな。 特殊文字かあ。 ' で括ってで問題なさげ
${a%'*b'}
なので、こうかな
eval 'b=${a%'"'${a#?}'}" 変数展開にこだわると特殊文字がきついな
eval容認するならもうcutでいい気が あら。" で括ってでいいみたい?また、入れ子にちゃんとなってるの?{ } でちゃんとなってるのか
echo "${a%"${a#?}"}"
dashでも大丈夫みたいな シングルクォートで駄目でもダブルクォートはいけるのか… あ、本当だ。パフォーマンス出るかな?
あとでやってみよう >>728
WSLも使ってるんだよね。cygwinもそうだったけど
外部プロセス起動っていうかforkになるのかしらないけど、
かなり遅くて、これぐらいに差になっちゃう
time sh -c 'for i in $(seq 100); do echo > /dev/null; done'
real 0m0.030s
user 0m0.000s
sys 0m0.031s
time sh -c 'for i in $(seq 100); do /bin/echo > /dev/null; done'
real 0m1.213s
user 0m0.000s
sys 0m0.750s evalはさほど変わらない
time sh -c 'for i in $(seq 100); do eval "echo" > /dev/null; done'
real 0m0.031s
user 0m0.000s
sys 0m0.016s >>730
めっちゃ高速化したw
1506文字を>>717でやったら1.7秒だったのが0.1秒にまで減った。およそ1/10
もっとも4倍の約6000文字をやったら1.6秒にまでなったので、
文字列が長くなるにつれてどんどん遅くなるようだね。
コピーする文字が多くなるからだろう。
sedで1文字ずつ分解した場合は6000文字でも0.2秒だったので
長い文字列を1文字ずつ処理するならsed、もしくはそれ相当の何かを使ったほうが良さそう。
(シェル芸で有名らしい grep -o . は改行が抜け落ちる) macOSのbrewでインストールしたdashで
echo '!' って実行したら \! ってなぜか
エスケープされて表示されるんだけど誰か心当たりある?
printf '%s' '!' でも \! と表示される もう一つ
case '!' in
[\!]) echo OK ;;
*) echo NG ;;
esac
これを実行すると、kshだけNGって表示されるんだけどkshのバグ?
mkshだとOKなのに >>736はここじゃ知ってる人少なそうなんでこっちに移動しますね。
OS XをUnixとして使ってる人の為のスレ 18 [無断転載禁止]©2ch.net
https://egg.5ch.net/test/read.cgi/mac/1462475819/ >>737
ブラケット内だけの特殊文字 ! (および ^) でのエスケープ対応が必須ならバグだし、言及してないとかだったら動作不定なだけだな
ブラケット内の ! と ^ でのエスケープが効く効かないの動作が違うのはcaseの場合だけじゃないよ >>739
いろいろ挙動を調べたけど
1. ブラケット内で!のエスケープは必須ではないし、必要ない。
2. 多くの実装ではどんな文字でもエスケープできるため \! は ! と認識されるが、kshはそうではない
3. ブラケットの先頭に!をつけた、 [!・・・] は否定表現
4. 否定表現自体にはどの実装も対応している
5. 例えば[A]だとAにマッチだが、[!]だと否定表現として扱われる
6. kshでは[!]を否定表現として扱われるのを防ぐ方法がない
7. 普通は[]を使うときは2文字以上になるはずなので殆どの場合問題ない
(ただし何かの処理で動的にパターンを生成している場合はありえる)
ってことなのかな?
ちなみにこれ、POSIXブラケット表現っていう名前なのかな? 動的の場合もksh以外でもエスケープしなきゃならないんだから同じじゃね
[!] は文法上エラーのようなもんだから、そもそもブラケットで括らないとかなんかもう一文字入れて ! を2文字目にするとか あー、動的っていうのは、
> そもそもブラケットで括らないとかなんかもう一文字入れて ! を2文字目にするとか
ということをしたいんだけど、
ここが設定ファイルに書かれている文字とかで
ユーザーが1文字を指定してしまった場合
とかいうことです。
まあ1文字なら[!]じゃなくて!にするようにすればいいんですが。
> 動的の場合もksh以外でもエスケープしなきゃならないんだから同じじゃね
ksh以外だとエスケープして [\!] と書けばOKですが、
kshだとエスケープして [\!] と書いてもNGという問題です。 POSIXブラケット表現は違うんじゃないかなあ
ブラケットだけを何というのか知らんけど、パターンマッチング、ワイルドカード、グロブ定義のひとつかな。グロブがどうやららしいがそんな言葉使ったことないw >>742
細かく拘ってるけど、なに言いたいのかちょっとわからないねえ。本題と関係ないってことでいいね? Bracket Expression
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_05
ワイルドカードっていうのは仕様ではなく何にでも使える文字という意味でしか無く
globはファイル名に展開するもののことだと思いますよ じゃ、パターンマッチングでいいよ。めんどくさいw
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13
2.13.1 Patterns Matching a Single Character
では、エスケープ対応しろと読めるような気がしないでもない。が、! 関連ではエスケープだけじゃなく動作が違うな、dash/bash/kshでは(bashだけが違うというのもある) あー、やっぱりバグな気がしてきました。
一旦変数に入れるとkshでもOKになりました
ちなみにksh以外とはbash、zsh、dash、yash、posh、mkshのことです。
# 挙動を合わせるためposix互換モードにしています
# もしかしてkshにも似たようなのありますかね?
# kshでPOSIXLY_CORRECT、set -o posixは使えませんでした。
[ -n "$BASH_VERSION" ] && set -o posix
[ -n "$ZSH_VERSION" ] && emulate -R sh
expression='[\!]'
case '!' in
$expression) echo OK ;; # ksh、ksh以外でOKになる
*) echo NG ;;
esac
case '!' in
[\!]) echo OK ;; # ksh以外でOKになる
*) echo NG ;; # kshだけNGとなる
esac なんか「バグ」にこだわっているようだけど、バグだったらバグレポートでもする気なの??
bashの [a!] の場合の方が大きな問題のような気がしないでもないが、それもエスケープすればすむのでkshさえなのかな?? >>748
> bashの [a!] の場合の方が大きな問題のような気がしないでもないが、
どういうことでしょうか?
試してみましたが、どの環境でも想定通り動いているようですが。
↓検証コード
[ -n "${BASH_VERSION:-}" ] && set -o posix
[ -n "${ZSH_VERSION:-}" ] && emulate -R sh
expression='[a!]'
case '!' in
$expression) echo OK ;; # すべてでOKになる
*) echo NG ;;
esac
case '!' in
[a!]) echo OK ;; # すべてでOKになる
*) echo NG ;;
esac
!は最初に持ってきたときだけメタ文字扱い(エスケープが必要)で
途中にあってもエスケープは必要ないみたいですね。
(むしろエスケープしないほうが良いみたい。後述?) ああ、すまん勘違いしてた。コマンドライン上での ! でのヒストリからの展開だった !が最初以外にある場合に、\! とエスケープするとどうなるか?ですが挙動がバラけました。
[ -n "${BASH_VERSION:-}" ] && set -o posix
[ -n "${ZSH_VERSION:-}" ] && emulate -R sh
expression='[a\!]'
case '\' in
$expression) echo OK ;;
*) echo NG ;;
esac
case '\' in
[a\!]) echo OK ;;
*) echo NG ;;
esac
# 変数に入れると a \ ! のいずれかだと判断されている
#(\はエスケープ文字列として認識されていない)
ksh OK NG
zsh OK NG
yash OK NG
posh OK NG
mksh OK NG
# 変数に入れると a ! のいずれかだと判断されている
#(\はエスケープ文字列として認識されている)
bash NG NG
dash NG NG
変数に入れない場合は、どちらも\はエスケープ文字列として認識されている まとめると、どのシェルでも同じように動かすには
1. 可能ならば!は[]の最初に書かない
2. 1を満たしている場合には、!はエスケープする必要はない(しても良い)
3. !が[]の最初に書く場合は変数に入れてマッチングさせる
4. 3の場合には、!はエスケープする
というところでしょうか? んー、発表会なの??どうすんのかどう書くのかじゃないのか?? ! を文字としてなら、ブラッケットで括らない、他の文字があるなら2文字目以降にする
だけじゃないのかなあ >>736はへえと思ったけど他は正直どうでもいい
シェルによって違いはあるものだし同じシェルでもバージョンによっても違うかもしれないし 文字列の末尾がLFのものを別の変数に入れる場合、
b=$a ってするしかないかな?
b=$(foo "$a") ってやったら消えるよね
関数で処理した結果を変数に代入したいんだけど、文字列末尾のLFは消したくないし、
LFはない場合も複数個の場合もあるので無条件にLFつけたりもできない IFS変更しなくてもb=$(foo "$a")ってやったら消えてないじゃん。"$a"ならば 消えますよ
[test.sh]
IFS=""
LF=$(printf '\012_') LF=${LF%_}
a="test$LF$LF$LF"
foo() { printf '%s' "$1"; }
printf '%s' "$a" # 1つめのテストの末尾のLFは消えていない
b="$(foo "$a")"
printf '%s' "$b" # 2つめのテストの末尾のLFは消えてる
[実行]
test.sh | hexdump -C
00000000 74 65 73 74 0a 0a 0a 74 65 73 74 |test...test| foo() { printf '%s ' "$1"; } とすると挙動が変わるんだね 違う。$(・・・)をすると挙動が変わる(末尾のLFに全削除の効果)
foo "$a" だけなら末尾のLFは消えない Command substitution の仕様ってことね。
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03
> removing sequences of one or more <newline> characters at the end of the substitution. そういやファイル名やディレクトリ名に改行を含めるべきかどうか
POSIXで議論してるみたいな話が上の方で書いてあったけど
名前の末尾に改行が含まれてる場合に消えるから
dirnameやbasenameで取得できないってことになるな。
もういい加減仕様で含めるのやめればいいのに >>763
あんたって決して自分のミスは認めないのね。うやむやにするいつもの人でしょ > IFS変更しなくてもb=$(foo "$a")ってやったら消えてないじゃん。"$a"ならば
消えますよ?だからまず自分のミスを認めましょうってことですよ。 自分のミスはちゃんと認めましょう。
認めるまで言い続けますよ > IFS変更しなくてもb=$(foo "$a")ってやったら消えてないじゃん。"$a"ならば
>>759を読みましょう。
明らかに消えています。
あなたのミスですよね?
実験もしないで嘘ばっかり alias wgeti='wget -ci <(cat <<_'
エイリアスでwgetをちょっと弄ったんですがこれの関数版作れないですかね
これで複数行のURLをDLできるけど最後に_と)入れる必要あるので bashの拡張機能で便利なのってなんだろうか?
変数展開は便利だと思うんだが、
配列とかハッシュとか必要なんだろうかね?
配列は標準入力から受け取ってループで回せば良いわけで
それが必要になった時点で使い方を間違ってるという気がしてる
他にbashで便利なものってあるかな?
pipefailぐらい? >>772
こういう事してるってこと?
alias wgeti='wget -ci <(cat <<_'
wgeti
http://example.com/a
http://example.com/b
http://example.com/c
_
)
それやるぐらいならこうするな。bash依存しなくてすむし
wgeti() { wget -ci -; }
wgeti<<URLs
http://example.com/a
http://example.com/b
http://example.com/c
URLs もしくは引数で渡す場合はこう
wgeti() {
for i in "$@"; do
echo "$i"
done | wget -ci -
}
wgeti \
'http://example.com/a' \
'http://example.com/b' \
'http://example.com/c'
短く書くなら
wgeti() {
printf '%s\n' "$@" | wget -ci -
} それってこれでいいのでは?
wgeti () {
wget -c $@
} ああ、でも、引数にするなら何もしなくていいのかw
そのまんま wget の後に URL 入れるだけだ。 標準入力からURLのリストを渡したいから
<(cat <<_って書いてあるんだと思った。
wget、普通に引数から複数のURL渡せるね コマンド引数の文字数制限に引っかかる可能性を
考慮すると wget -ci <(cat <<_ の方が無難なのだろう
(xargs でもいいけど) local or typeset を使用しても本物のローカル変数ではないというのは面白い性質だよな
(本物のっていうのは一般的な言語相当のローカル変数という意味)
i=A
foo() {
local i=B
echo "foo1 $i" # => foo1 B
bar
echo "foo2 $i" # => foo2 C
}
bar() {
echo "bar $i" # => bar B
i=C
}
foo
echo "$i" # => A
「この関数の中だけで使う変数です。」ではなくて
「localの場所で変数を保存します。関数が抜けたら保存した値を戻します。」
という意味なんだよね。
POSIXにはないlocalやtypesetを使っても本物のローカル変数にはなれないが、
引数だけは本物のローカル変数になっているというのも面白い
(何も書かなくても関数に入った時点で、自動的にlocalが実行されると考えることもできる)
引数への代入は $1=123 とか 1=123 みたいにはできないけど、
set -- "123" "456" "789" みたいにすると再設定できる。
$1だけ設定したくても、すべての引数を設定する必要があるけど。
グローバル変数は時に分かりづらいバグを生むことがあるけど
これをうまく使えば、使用する変数をなくせたり減らせたりするかもしれないな ダイナミックスコープはperlとかpowershellとかmathematicaとかにもあるけど、これもグ口ーバル変数並にバグの温床な気がする あぁ、これがダイナミックスコープのことなのか
Perl?って思ったけど、(Perlの)localを使った場合の話なのね。
通常はmyを使ってたから。 ふと思ったんだけどシバンってあるじゃんシバン
あれってさ、#がコメントじゃない言語だったらどうするの?
Cインタプリタだったら
//!/usr/local/bin/c
とか書くの? >>784
シバンってカーネルが解釈してんのか
だからFreeBSDとOS XとGNU/Linuxで挙動が変わるんだな。同じbashでも。 >>783
面白いネタを振ってくれてありがとう。いろいろ調べて勉強になったよ。
ちなみに質問の答えは「できないとは限らない」ということになるかなあ。
ネタを振ってくれたことには感謝するけど、自分で調べるほうが楽しいよ。 今日の荒らしは ID:fcPV9kIu か。NG推奨 >>786
FreeBSDだと
#! /usr/bin/env awk -f
これが普通に通るけど
GNU/Linuxだと
“awk -f”なるコマンドがないとかなんとか言われる 素朴な疑問
・ shebangは シェバン? シバン?
・ "#!"の後にスペース入れずに "#!/bin/sh" ? スペース入れて "#! /bin/sh" ?
自分はともに前者、特にスペースについては入れるべきではないというの最初に覚えたんだけど、
結構後者も目にすることがあるので、実際のところ、どうなの? >>790
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/execve.2.html
うぉ、Linuxまじ最低だな
インタープリタースクリプトの optional-arg 引き数の解釈方法は実装により異なる。
Linux では、インタープリター名 interpreter に続く文字列全体がインタープリターに
1個の引き数として渡される。 しかし、動作が異なるシステムもある。 あるシステム
では、 optional-arg のうち最初のホワイトスペースまでが 引き数として渡される。
また、別のシステムでは インタープリタースクリプトは複数の引き数を持つことができ、
optional-arg 内のホワイトスペースが引き数の区切りとなる。 >>790
本題のshebang仕様とは話がずれるが、
awkはいにしえの奴も含め俺の知る限りすべて/usr/bin/awkで起動できるから
env使う必要ないと思う。 >>791
#! の後のスペースは、どのOSでも有無に関わらず動いたと思う。
ただしshebang行に32バイト制限のあるOS があったので、
それに引っかかるギリギリならスペース無しにする必要アリ。
読みは知らない。 >>795
システム付属じゃ駄目で、自分でビルドした特有の事情があるなら、絶対パス指定で呼べばいいのでは? >>796
それだと実行権限の意味がなくなるじゃん
実行権限をつけるのは、いちいち実行プログラムのパスを指定しなくていいからでしょ?
拡張子もなくせばなんの言語で作られているかも意識しないですむし。
手でコマンドを打ったときと同じように、環境変数の$PATHからどれを使うかが決まる。
そもそもなんで最初からそういう仕組みにして置かなかったんだろう?
そうすりゃシバンなんて #!awk だけですんだのにね 実行権限は絶対パスでも相対パスでも必要なので関係ない スクリプトのパスとインタプリタのパスを混同している >>798
シバンの話だよ
実行するスクリプトのパスじゃなくて
実行するスクリプトが使用するインタプリタのパス シバンの話は分かってるけど?
実行するスクリプトが使用するインタプリタに実行権限付いてなかったら
当たり前だけど絶対パスで指定したって実行できないよ? >>797
なんか誤解してる?
絶対パスで書くってのは
#!/home/me/bin/awk -f
みたいに書くって意味だよ。 >>794
> shebang行に32バイト制限のあるOSがあった
なるほど、そんな理由もあったんだね。
逆にスペースorタブを入れなければならない、なんていう例(4.1BSD)もあったみたいだ。
これについては修正されたようだけど、今でもこれを守っている人もいるらしい。
同じ#で始まっていても、コメントとは違うと思うから、
やはりスペースを入れることにはなんとなく躊躇しちゃうわ。 俺は半分脳死状態で
#! /bin/sh -
↑半角スペース ↑ハイフンマイナス
にしてるわ。
上でも書いてくれた人がいるけど,#!の後に空白が必要な環境があったり
先頭行から継続してパースしてしまい
(ほとんどありえないことだけど)
#! /bin/sh
-c
みたいなファイルに対し
/bin/sh -cというオプション付きshインタプリンタを起動してしまうOSもあるみたい
(オライリーのシェルスクリプト本に記述あり) - で閉じるのはオレもやってるけど、
シバンの後のスペースは入れない
#!/bin/sh - >>802
わかってる
#!/home/me/bin/awk -f
って書いたら、必ず /home/me/bin/awk が使われてしまう
例えばdebian 9のawkは4.1.4だがdebian 7は4.0.4だった
debianのawkのパスは /usr/bin/awk だが。debian 9で自分でawkの
最新版をビルドして /usr/local/bin/awk に入れたとしよう
awkスクリプトのシバンが #!/usr/bin/env awk と書いてあれば
$PATHを見て適切な /usr/local/bin/awk を選んでくれるが、
envを使ってないと、/usr/bin/awk 決め打ちになってしまう
大量にある(かもしれない)awkスクリプトのシバンを全部書き換えるなんてナンセンスだし
せっかく実行権限が付いてるのに、awk スクリプトファイル名 と書くのもナンセンスだろ
実行プログラムが何の言語で書かれているかなんて、利用者には知ったことじゃないんだから
fooコマンドはfooコマンドとして実行してほしいし、 使用するインタプリタは $PATH を見て欲しい >>806
何をしたいとかは別として、実装としてできないんだよ。
カーネルのシステムコールexecveはPATHを見ない。
PATHを見てるのはユーザランドのライブラリ関数のexecvpとか。
大改造が必要になる。 >>808
実装としてできないってどっちの話?
勘違いしている人がいて、話の前提で止まっている人がいてややこしいけど
>>806の話は理解した上で、俺が提案した #!awk でいいじゃんって話だよね?
PATHを見れないというのなら、見る必要はないよ。
#!awk -f という記述(絶対パスでないもの)を決め打ちした文字(/usr/bin/env )を
頭に入れて #!/usr/bin/env awk -f として解釈すればいいだけ
どういう文字を頭に入れるかはディストリが決めたカーネルの
ビルドオプションででも設定すればいいだろう
単なる文字列の変換でしかないので、カーネルだけでできる カーネルが特定の決め打ちしたバイナリを呼ぶようなことはないよ。
せいぜいinitだけ。 そういう中途半端なレスはやめて欲しい。
結局>>809の方法で可能だってことだろう?
そうでないなら、そうでないとわかるように理由を添えて書いてくれ それほど言うなら試しにlinuxのパッチ書いて投げてみたら? 補足すると>>809読めばわかると思うけど、読み取ったシバンの文字列を置き換えるだけ。
だからカーネルが特定の決め打ちしたバイナリを呼ばないというのが事実であっても
読み取ったシバンの文字列を置き換える話と無関係の話ということ >>812
話がすり替わってる。
技術的に可能かどうかの話をしている所に、
じゃあってみせろと言われても、
それは関係者を説得するのは難しいだろう?別の話だろ? 可能か不可能かで言えば、もちろん可能だよ。なんだって可能。
でも、カーネルとユーザランドは明確に分けろって怒られるだろうね。 >>815
話聞いてるか?
シバンはカーネルが読み取るもの
ユーザーランドのものには一切手を出していない。
読み取ったシバン文字列を置き換えるだけなんだから >>809
カーネルいじればそれは可能だな。
カーネル書ける人なら目茶目茶難しいってほどじゃないから、
カーネル書ける人雇えばいいぞ!
ただしそれを標準カーネルの機能として入れてもらえるように
議論するのは、カーネルに機能追加するよりだいぶ大変かも。
#! じゃない別のmagic文字列にした方が提案通りやすいかもな。
頑張れw >>817
技術的に可能でありユーザーランドを触ってないってのは同意したの?
だから関係者と話をつけるのが難しいっていうのは
別の話だから、すり替えるのはやめてくれと行ったんだが つーか、いい加減にしないといつもの荒らしモードに入るぞ?w
議論に負けそうになると、話をすり替えて、
俺を呼ばわりするのはいつもの手だよなw
もうそろそろ荒らし認定することだと思ってるんだが?w 訂正
俺を荒らし呼ばわりするのはいつもの手だよなw 反論しないならさっさとNGIDに入れて
俺に反論できない状態を作ってくれよ?
見れなくなったら俺に反論できないんだから
それこそ俺の望んだ結果だw
はい、結論。>>809の方法で技術的には実現可能です。
反論がある人は、関係者を説得して調整をするのが難しいって
別の話にすり替えないで技術的な話でお願いしますねー >>818
なんか別人と勘違いしてるようだが、俺は技術的にできないと書いたことは一度もない。
この勝手に勘違いしてるあたり、もしかしていつもの人か? >>822
はい、技術的な内容を長文で書いて
相手を論破するのは、いつもの俺のパターンw だって勝手に勘違いして勝手な仮定して勝手に腹立ててるんだもん。
せっかく賛成してた俺まで敵視しだす有り様だし。
自業自得ってことよ。 >>824
5ちゃんねるなんだからこの程度のもんよ
こっちが真面目に話をしていても、とりあえず何か言い返せば
それが反論したことになるみたいな、みたいなクソみたいなレスしてくる
いい案だと思うなら一言「それはいい考えだ」ぐらい書けと
自分が間違っていたら、素直に間違いを認めるやつばかりなら、
それもこんなにどうでもいいことを、毎回書かなくてすむんだよ >>816
ファイルシステムの構成に何らかの仮定を置いた時点でユーザランドと分離できていない。 >>827
ファイルシステムの構成に仮定をおいたりしてない
単にシバン文字列を置換するだけ >>829
仮定せずにどうやって/usr/bin/env付ければいいってわかるの? >>830
単なる文字列の置換に過ぎない
カーネルはシバンがファイルパスなんて思ってない。
カーネルがシバンを読み取るというのなら、少なくとも
読み取ったものがシバンであるということはわかってる
あとはそこににある文字列が、ファイルパスだろうが
ランダム文字列だろうが関係ない
単に#!の後に固定の文字列を埋めるだけ
あとは後続のプログラムに渡せば、
そいつが勝手になにかしてくれるんだろ?
それはカーネルの知ったことじゃない >>832
お前1人で意味不明の話をしてるんだってw
(awkスクリプトで書いた)fooコマンドが実行できるのは
fooコマンドに実行権限がついているからだし、そのfooコマンドの
シバンで指定されたプログラムも実行権限がついていなければいけない
当たり前の話だが、上記の理由により awkであっても /usr/bin/envを
使っておいたほうが良いって結論を言ったんだが、
それに対して前は何の話をしてるのだ? どうもこの話を理解できないのが、おかしいと思うんだが、
もしかしてawkスクリプトに実行権限をつけるという発想がないのか?
いつもawk -f スクリプトファイル名 で実行してるとか?
いや、まさかな。
シバンはスクリプトファイル名だけで実行するためにあるんだし
そのために実行権限つけるだろう。
でもなぁ、ここまで以上に理解能力がないのは、
まかさが的中しているとしか思えない。
シバンをつける意味もわかってなかったりしてw ここまでの話全く読んでないけどawk実行させる時は-f使うわ >>835
ということは、シェルスクリプトを実行させるときはsh使って
perlスクリプトを実行させる時はperlを使ってるのかな?
かつてsystemdが普及するまではみんなが使っていた
serviceコマンドやbyobuはシェルスクリプトだし
apt-fileやshasumはPerlスクリプトだし
ufwはPythonスクリプトだよ
実装がなんのスクリプト言語で作られているかなんて気にしなくていいじゃないかw shは実行権限つける
perlは場合による
意味はない >>833
俺は>>797でお前が意味不明な
> それだと実行権限の意味がなくなるじゃん
と、書いてたからパス指定と実行権限の意味は無関係だと指摘してるだけなんだが
機能的文盲とかいうやつなのか? $ls aho.sh
rw-r--r-- aho
$. ./aho.sh
aho
$ >>838
確かにあの書き込みは全体的に意味不明だったね。 >>838
> と、書いてたからパス指定と実行権限の意味は無関係だと指摘してるだけなんだが
> 機能的文盲とかいうやつなのか?
実行権限がついているとパスの指定を省略できるんだよ
ご存知じゃないかもしれないが(皮肉)パスの指定を省略した時に
$PATHに設定された複数のパスから、パスを補完してくれる機能がある
つまり$PATHからパスを補完してほしいなら実行権限をつけないとだめ
(awk)スクリプトを$PATHの中から補完してほしいなら実行権限をつける。
そうするとパスを省略して実行できる。
スクリプト自体は$PATHから補完してくれる、だけどそのスクリプトに
シバンが/usr/bin/awkとなっていると、スクリプトを実行するインタプリタは
/usr/bin/awk固定となってしまう。
/usr/bin/env awk -f と書くことで、インタプリタ自体も$PATHから検索してくれる
パス指定を"省略すること" と 実行権限の意味、いい加減理解しましたかね? ほんと、理解能力がないのか、
それとも、単に技術レベルが数ランク下なのか知らんが
馬鹿を相手にしてると疲れる。煽りたくもなるわw > 796 返信:デフォルトの名無しさん[sage] 投稿日:2018/09/14(金) 12:12:08.80 ID:CXa+ZLzo [3/4]
>>795
システム付属じゃ駄目で、自分でビルドした特有の事情があるなら、絶対パス指定で呼べばいいのでは?
797 名前:デフォルトの名無しさん[sage] 投稿日:2018/09/14(金) 16:14:10.39 ID:6xTUz+7n [2/20]
>>796
それだと実行権限(をつけてパスを省略できるようにした)の意味がなくなるじゃん
ここまで言えば、馬鹿でも理解できるかな?
まだ説明しないと理解できない? 実行権限は単に実行可能にするだけじゃない
パスを省略して$PATHの中からパスを補完してくれる機能があるのだ まあ、細かいことを説明するなら、"スクリプトファイル" の実行パスを
検索してくれるのはシェルで、シェルが$PATHの中から
実行ファイルを見つけることができるようにするために実行権限をつける
でも今は "スクリプトファイル" の実行パスの検索の話ではなく
シバンから起動する "インタプリタ" の話
シバン自体には$PATHの中から検索してくれる機能はなくて
単にシバンに書かれたパスのプログラムを実行するだけ
そこで出てくるマジックが /usr/bin/env awk -f
シバンは$PATHを検索しないが、/usr/bin/envが$PATHを検索して
適切なプログラム(ここではawk)に引き継いでくれる
などと丁寧に説明してやったら、今度は長文だーとか言って
荒らし呼ばわりするんだろう? 話は変わるけどさ、
シェルスクリプト(シバンは #!/bin/sh 実体はdash)に
A=
A=123 echo "$A-1"
echo "$A-2"
って書いて実行したら以下のように表示されるんだよ。
-1
-2
この動きはA=123が評価される前にechoの変数展開が行われて-1になって
実行したらAの内容が元に戻るから-2と表示されるということで理解できる
でも以下のように書いたら
A=
A=123 eval 'echo "$A-1"'
echo "$A-2"
次のように表示されるんだよ
123-1
123-2
これはどういうわけだろう?
さらにbashとzshで実行した場合は以下のように表示されたw
123-1
-2
この動作ならまだ理解できる。
でもkshやposhやyashなんかはdashと同じ
どっちが正しい動きなんだろう? >>847
単にシェルごとに仕様が違ってるだけで全て正常動作だろうし正しいと言えば正しいのでは?
てか、あらゆるシェルはこのような時はこのような動きにならなければいけないみたいな決まりがあるわけでもないんだから正しいか間違いかで考えること自体がおかしい。 >>849
> 単にシェルごとに仕様が違ってるだけで全て正常動作だろうし正しいと言えば正しいのでは?
POSIXの仕様と照らし合わせてって意味だよ
POSIXの仕様と照らし合わせて正しいのか間違ってるのか
そもそもPOSIXにこういったときの仕様は定義されていないのか
> あらゆるシェルはこのような時はこのような動きにならなければいけないみたいな決まりがあるわけでもないんだから
決まりはあって、それがPOSIXの仕様のことだよ >>848
> またかww
うん、またなんだ。済まない。
バーボン(略 よほどリアルでぼっちなんだな。そらそうだなという人格と見えるし 俺自身にもそういう傾向があるが
訊かれてもないことをずらずら書いて自己満足に浸るのはよくないと思う。
現実の人間関係でもそういう人はハブられがちだし。 聞いたことを答えないで
聞かれてないことを答えるのは
それはそいつが何も知らないときだ
オマエはなにもわかってない >>855
誰がそんなことを答えてくれと質問したんだ?
聞かれてないことをペラペラ喋ってるのは
あんただろう?w 質問のときだけはへり下るのな
身を正してのつもりかもだが、質問のときだけですぐに豹変するからお前の場合はもうただただ気持ち悪いだけ 何だ?質問も高圧的にすれば満足するんか?
ただ文句言いたいだけだろ。
そんな無駄な会話してないで
本題にもどれや どうしてそっちになるのだか。やっぱりそっちが素で付け焼き刃のへりくだりか
社会的にはは豹変しない方になんだけどなあ やっぱり意地でもスレと無関係の話をしたいようだ。
お前がいなくなればスレは平和になるのになぁw なにその俺は違う的なレスは
さすがいままでのレスで自己中ぶりを発揮しまくっただけあるやつだなあ。ただただ気持ち悪いのもそれは自己中ぶりからなんだかが、わからないだろうな、わかってたらそんな自己中にはならんだろうし なるほど、コマンドライン上にある変数(シェルが予め展開する変数)はそのままなのか
fork & exec されるプロセス空間の環境変数にのみ作用するのだからそうなるわな
$ PATH=hoge ls "${PATH}"
$ PATH=hoge /bin/ls "${PATH}" >>865
それと、(一時的)環境変数をいつするのかと、環境変数をいつ展開するのかが被ってるてとこかなあ
A=123 /bin/echo "$A"
A=123 bash/dash/ksh/etc... -c 'echo "$A"' >>866
そのコマンドラインは,「直前に指定した変数が影響しない」のが正しい挙動だよな
なぜならシェルはそれらを一緒くたに処理するから,変数の変化を参照できない
↑この理解って正しい?
bashコマンドラインで
$ VAR=val echo $VAR
# なにも返らず
$ VAR=val; echo $VAR
val
こういう挙動から推測したんだけども。 >>865
forkされる場合ってのはわかりやすいんだけどね
> A=
> A=123 echo "$A-1"
> echo "$A-2"
>
> 次のように表示されるんだよ
> 123-1
> 123-2
実行するのがシェルビルトインコマンドであっても実行後は元に戻る
ん?頭にA=123をつけた時、本当にシェルビルトインの
echoが呼ばれてるのか?と思ってecho --versionとしてみたが、
やっぱりシェルビルトインの方だった。
(/bin/echo --versionだとバージョン情報が表示される)
他のシェルで試してみたがすべて同じ挙動
ということで
> A=123 echo "$A-1"
と書いたら変数の内容は実行後に元に戻る。
というのが基本の動きでいいのだろう
まあよく知られた機能だよね。 ちなみにコマンドライン(シェル)じゃなくて
スクリプトを書いて実行して確かめてる 知ってると思うんだけど、念の為
var=value command
この構文は、変数varにvalueを入れるだけじゃなくて
export varした状態になる。だからcommandが
外部コマンドであっても値は引き継がれている
(今回の話とは直接関係はない) 話を簡単にすると
A=
A=123 eval :
echo $A
dashだと123と表示される。
bashだと何も表示されない。 >>872
ふむ、bash で set -o posix してから実行すると 123 って表示されるね >>873
それは気づかなかった。ってことはPOSIXで仕様化されてるってことかな?
evalだけ特殊と。なんでだろうね。 >>871
$ VAR=val echo $VAR
とした場合,「VAR=val」が反映されていないように見えるのはどうしてだろう >>875
それは単に「VAR=var echo $VAR」が1行だから
先に$VARが展開されるだけだと思うよ
変数を一時的に変更したいけど、別変数にバックアップして元に戻すの面倒だな
その他にも方法あるけどアレ(省略)だし、
よし、var=value command構文を使おう!
うお、先に$VARが展開されちまった
ぴこーん!だったらeval使えば先に展開されることないんじゃね?
よし動い・・・あれぁ、変数を一時的に変更したかったのに
実行終わっても変数が元に戻らないよぉ
よし5ちゃんねるだ。という流れw >>876
もうとっくに分かってると思うが 俺が思い付いたのは
$ VAR=val-b4
$ (VAR=val-tmp; echo $VAR)
→ val-tmp
$ echo $VAR
→ val-b4
くらいだな https://i.imgur.com/VhwX2Fq.jpg
このスクショのようにmediainfoというコマンドのAudioの項目のFormatを取り出す方法教えてほしいです
。
以前はそのAudioのFormatという文字列はFormat profileだったので、
mediainfo "$FILE" | grep -E '^Format profile' | sed -E 's/.*: (.*)/\1/'
こうやってその行を抽出していたんですが、mediainfoがバージョンアップしてFormatという文字列に変わってしまいました。
Generalの項目にもFormatがあるので、これだと調べられません。
どうやるんでしょうか? GNU sed の -r オプション使ってるけど、こんな感じで
$ mediainfo "$FILE" | sed -nr '/^Audio/,$s/^Format +: (.+)/\1/p' >>878
mediainfo "$FILE" | sed -n -E '/Audio/,/\s*$/{s/Format\s*:\s//p}' ヘルプメッセージ読んだらこれでいいかも
$ mediainfo --Inform="Audio;%Format%" "$FILE" Audioにformatが複数あっても対応できないかなー?ってやってたら遅れたw >>878
mediainfo "$FILE" | sed -n -e '/^Audio/,$p' | grep '^Format' | cut -f '2-' -d ':' -s
これでどうだろう?
ところで綺麗な端末だね。 ちなみに俺のコマンドラインはPOSIXに準拠してるので可搬性は高いと思うよ(ドヤ顔) Format複数あっても出力されるはずなのにおかしいと思ったら
CRLFになってたw いい加減ATOMのデフォルトを変えないと
>>885
> POSIXに準拠してるので
そうそう。それを言おうと思っていたw
>>879
> GNU sed の -r オプション使ってるけど、こんな感じで
-r じゃなくて -E を使えば良いのでは?
POSIX準拠?かどうか知らないけど-Eは使えるはず >>886
>> GNU sed の -r オプション使ってるけど、こんな感じで
>-r じゃなくて -E を使えば良いのでは?
>POSIX準拠?かどうか知らないけど-Eは使えるはず
癖で指が -r を押してしまう…以後気をつけます Macだと\sは使えないのかな?
とりあえず>>879を参考にしつつ修正してみた。
General、Audio、の次になにか来ても対応できるようにしてみた。
これなら-Eいらんかったわ。macOSで動くのを確認済み
sed -n '/^Audio/,/^$/ s/^Format *: *// p' -Eが良いよ(ドヤァ)
POSIX準拠というより可搬性重視なので、
-Eが使えるなら-Eつけてれば良いんじゃね?ぐらいに思ってるw >>883
> grep '^Format' | cut -f '2-' -d ':' -s
grepしてcutするって流れは、俺もよくやるんだけど、
awk一つにまとめられる(と後からよく気づくw) >>890
でもなんかその操作をawk一つにまとめるって
emacsのorgモードに近い印象を受けるというか
ちょっとUnix哲学っぽくねえなと思う。
もちろんUnix哲学に従う必要性は皆無なんだけど,あくまで個人的な意見として。 >>891
それ言ったらsedは今回、範囲選択+行選択+置換 の3つを同時にやってるんやで?w >>892
俺の >>883 ←これはそんなことやってねえぞ(謎の自信)
検索→表示オンリー
スレチにもほどがあるのでそろそろやめるわ sedもawkも複数行のスクリプトを実行できるわけで
一つのコマンドで複雑な異なる機能を提供してるから
Unix哲学から反してるのかもね
だから例のアレはUnix哲学がどうとか言ってる割に
結局awkでプログラム書くんかいって突っ込みたくなるんだな まだとどまる事のない誤解を披瀝し続けとってわろたw みなさんどうもありがとうございます!
>>881
おお!こんなオプションがあったんですか!って思って試してみたんですが、
上のスクショのLC-AAC-Sample.aac、HE-AAC-Sample.aacで試すと、どちらもAACと表示され、
このファイルはLC-AACかHE-AACなのか判別して次の処理に進む事が出来なかったので、このオプションではダメでした。
INFO=$(mediainfo "$FILE" | sedほげほげ"
case "$INFO" in
"AAC LC" )
ほげほげ1
"AAC LC SBR")
ほげほげ2
*)
ほげほげ3
って感じで次の処理に進むんですが、
>>879、880、888だとほげほげ1か2に進めて、>>883だとほげほげ3になってしまいました。 >>883
端末はMacのiTerm、シェルはfish、プロンプトは適当にいじったやつです。 >>896
> このファイルはLC-AACかHE-AACなのか判別して次の処理に進む事が出来なかったので、このオプションではダメでした。
ちゃんと調べた? %Format%以外で出るのあるんじゃないの? >>898
Audio;%Format/Info%
だと上のスクショの
Advanced Audio Codec Low Complexityなになに
が取り出せるようでした。
これだとLC AACならAdvanced Audio Codec Low Complexity
HE-AACならAdvanced Audio Codec Low Complexity with Spectral Band Replication
が取り出せるので判別出来そうです。 >>896
>>883のコマンドラインを提案した者だが
mediainfo "$FILE" | sed -n -e '/^Audio/,$p' | grep '^Format' | cut -f '2-' -d ':' -s | sed -e 's/^[[:blank:]]//1'
↑これでいけるかな。
ただ長いので他の人のを使ったほうがいいかも >>899
ところで
http://www.mpeg-audio.org/members/files/DASH_Files/Audio_Only_Stereo_Dash.zip
↑こっからDLできるサンプルファイルで試したところ
AAC-LC/Technology-en-69s-2-lc-64000bps_seg.mp4
と
HE-AAC/Technology-en-69s-2-heaac-64000bps_seg.mp4
は
mediainfoの出力結果で
Audio;FormatではどちらもAAC表示で区別できず
Audio;Format profileでやっと区別できるんだけど,俺の勘違いかな。 何度も投稿してすまん。
これでいいんじゃないかな。
確かめた環境はMediaInfo 0.7.91 on Debian 9.5。
case "$(mediainfo --Inform='Audio;%Format_Profile%' "$FILE")" in
HE*) echo 'HE';;
LC*) echo 'LC';;
esac >>896のコード見て思うのは
Unix哲学(を完全に受け入れたわけじゃないが)
9. 全てのプログラムはフィルタとして振る舞うようにせよ。
すべてのプログラムはフィルタとして振る舞うようにしたとして
そのプログラムを使う側もフィルタとして利用するようにすべきだと思うわけよ
つまりね、こういうふうに書くべきじゃないのか?ってこと
mediainfo --Inform='Audio;%Format_Profile%\n' "$FILE" | while IFS= read -r line; do
case $line in
HE*) echo 'HE';;
LC*) echo 'LC';;
esac
done
本当は$FILEの所も"$@"にして複数ファイル対応できるようにしたい。
だけどメディアファイルっていうのはオーディオを複数入れることができるはずだから、
この場合どうなるのか?という疑問がある。その場合はうまくいかないかもしれない。
まあ適切なサンプルファイルを思いつかんし面倒だから試しては見てないが みなさんどうもありがとうございます
>>896の時点のコードは以下です
https://pastebin.com/qdNT6iBm
拡張子がaacのファイルがあるディレクトリでこのスクリプトを動かしたらaacファイル全て(ひとつづつ)処理させてます。
>>900-903
明日確認してみます
$ mediainfo --version
MediaInfo Command line,
MediaInfoLib - v18.08.1
以前のバージョンではFormat profile欄があったのでそこで判別してたんですが、いつのまにか(昨日気がつきました)最近のバージョンではFormat profile欄がなくなっているんです。>>878のスクショです >>904
なるほどね。Debainのaptで入れたやつは古いのか。
$ mediainfo --version
MediaInfo Command line,
MediaInfoLib - v18.08.1
$ mediainfo --Output='Audio;%Format_AdditionalFeatures%' ./Audio_Only_Stereo_Dash/HE-AAC/Technology-en-69s-2-heaac-32000bps_seg.mp4
LC SBR
$ mediainfo --Output='Audio;%Format_AdditionalFeatures%' ./Audio_Only_Stereo_Dash/AAC-LC/Technology-en-69s-2-lc-64000bps_seg.mp4
LC
これは結構見分けやすいんじゃないか? >>904
ちょっと訊きたいんだけど,MPEG4のLCとHEの違いってSBRが適用されてるかいなかの差?
もしそうならまさにそのオプションがあって
mediainfo --Output='Audio;%Format_Settings_SBR%'
↑これは,SBRが含まれていれば“Yes (Explicit)”,含まれていなけば空文字を返す。 >>904
> >>896の時点のコードは以下です
> https://pastebin.com/qdNT6iBm
つまらん。特に指摘する点はない。
細かい趣味程度のことぐらいだな。
ファイルは引数で渡したほうがいいんじゃね?とか
俺ならset -eu -o pipefailをつけるとか
(一行で書く場合を除いて)コマンドの後ろの ;; は嫌いだとか ネタフリ、これ前に紹介したことあったっけ?
modernish: a shell moderniser library
https://github.com/modernish/modernishhttps://github.com/modernish/modernish#modernish-a-shell-moderniser-library
良さそうなことを書いてあるが、大きすぎて、それでいて何ができるのかよくわからない
ようするに誰か日本語で簡潔に解説してくれとw 変な人が二人いるせいで質問者が帰っちゃったじゃん。せっかく良い案を思いついたのに。 いや、気にせず書けよw
また見るかもしれないじゃん 二人いるんじゃなくて、同一人物なんじゃ?
例の人、プロバイダー2つ契約してて自演に使ってるんだし。 引用符を除去するいい方法ってないかな。
個人的には変数の仕様("abc"はabcとみなされる)とかを利用してエレガントに解決できるんじゃないかと思ってるんだけど うまくいかん。
いまのところsed -e 's/"\([^"]+\)"/\1'で問題はないけれど「\"」の形のエスケープに対応したりするのが面倒になってくるんだよね この形だと。 a='"aa\"a"'
eval echo "$a" とか eval "b=$a"
じゃだめ?
おまけ、最近のbashには以下のような変数展開が
増えているけど今回は関係なさそう
${parameter@A}
${parameter@E}
${parameter@P}
${parameter@Q} >>916
なるほどevalは思いつかんかったわ。
ただそれだと "aa\""→aa" になってしまうんだが これは正常な動作なんだろうか。 >>917
さあね。「引用符を除去するいい方法」の正確な意味がよくわからないので
もしかして単に前後の引用符を除去するだけだった?
ならこれだけで行けるけど
a='"aa\"a"'
a=${a#\"}
a=${a%\"}
エレガントに解決っていうから、なんかもっと複雑な話かと思った >>918
いや 別に文句を言ったつもりはない
先に挙げてもらった方法で解決してるし あれはすごくエレガントだと思う。
エレガントっていうのは数学畑の言葉のつもりで使った。
つまりまわりくどいやりかたではなく本質をつらぬいた方法。
今回は,
「シェルに対してトークンの区切りを示すための引用符をシェルに読み込ませることによって除去する」
という非常に直感的で素晴しい方法を学べた。
俺のやりかたはわざわざsedを使ってる点で,シェルが解釈するという本質から外れてしまっている。 ちなみにやりたかったことは単純に
VAR="value with space"
↑こういうことが書かれたファイルから
value with space
という語句を取り出すというもの。
$ cat /etc/os-release | grep '^PRETTY_NAME' | cut -f 2 -d '=' | eval echo "$(cat)"
↑こういう感じ。 $ cat /etc/os-release | grep '^PRETTY_NAME' | cut -d'"' -f2
というのはどうだろう >>919
単に文字列の途中にどういう意味かわからなかっただけだよ。
>「\"」の形のエスケープに対応したりするのが面倒
とか書いてあったから、何がしたいんだろうと
前後の""を取るだけなら>>918のやり方が最短で最速
>>920
> VAR="value with space"
> ↑こういうことが書かれたファイルから
> value with space
> という語句を取り出すというもの。
それだとまた話が変わってくるな
(. /etc/os-release; echo $PRETTY_NAME)
()でくくってるのは、単に変数のスコープをサブシェルに閉じ込めてるだけ
カレントシェルにばらまいていいなら()はいらない
シェル互換の文法としてみなせるファイルならこれでいけるよ
コードが入っていたら実行されるから、安全なファイルと断定できるものにしか使えないけど "a" → a
こういう変換は、CSV でも苦労してる。
" が偶数個なら良いけど、奇数個なら形式エラーにするとか
CSV は、様々なバグが考えられるから、TSV が良い
"a""b" → a""b
ただし、" " 内で、" を使う場合、"" と連続させる。
この場合も、奇数個なら形式エラーにするとか、ややこしい >>923
別々の言語で3回ぐらいCSVのパーサーを書いたことありますよ
ダブルクォートがない場合、あって改行が入ってる場合など
Excelの仕様に完全対応したCSVライブラリがその言語になかったので
Perlの変態正規表現レベルにまでなれば可能かもしれないですが、
そういうネスト構造のあるものは単純な正規表現では解決不可能な問題です。 タブ区切りでも
当然ダブルクォートがいる
頭悪いこといってるわ。。。 ダブルクォートを特別扱いするかどうは仕様によるのでは? >>927
それって区切り文字がタブの場合も書かれてるの? それくらい読めよw
RFCにはないけど、MIMEタイプ定義してる
https://www.iana.org/assignments/media-types/text/tab-separated-values
によると、
Note that fields that contain tabs are not allowable in this encoding.
となっているし、たぶんEOLも含んじゃだめそうなので、ダブルクオートいらねえよ。 まあいくらRFCで規定してもディファクトスタンダードのExcel読めるフォーマットでないと意味ないしな w >>930
RFC4180とExcelのCSVはほとんど同じ
違いはデータの中に改行が含まれてる場合
Excelデータの中の改行はLF。(一行の最後はCRLF)
RFC4180はデータの中の改行はCRLF(一行の最後は同じくCRLF)
これだけしか違いはないよ CSVもTSVデータとしてキーボードから入力可能な文字を
区切り記号としているわけで、なんで
RS (0x1e Record Separator) とか
US (0x1f Unit Separator) とかいう
便利な文字を使わなかったのか?って思うな 頭悪いこといってるわ
そんなコードなキーボードからどうやって入力すんの
viならできるが
こんなアホが、vi使えるとは考えらればいしな >>931
ほとんど同じとか言うプログラマーは信用できない そもそもCSVは数値の表のためのデータ形式だからね カンマのキーとタブのキーと改行のキーは
どのキーボードについてる
低学歴知恵遅れにはコレが分からない CSVネタで久しぶりにアノヒトが嬉々として現れたなってことかな?w つーかCSVファイルをテキストエディタなんかで閲覧、編集する人なんていないでしょう?
可能か不可能かで言えば、可能だけどバイナリエディタでテキスト編集するような感じで
効率が悪いから、みんなエクセルつかってCSVファイルの読み書きするんだけど 国によっては、カンマとピリオドの意味が逆転してるのあるけど
そんな国でも割り切って、セパレータはカンマにしてるんだろか
小数点がカンマ、どーしてそうなったか興味あるが 引用符でくくられてたらどんな記号でも問題起きないからな
textを普通のエディタで開いてなんのコードが混入してるか分からないほうが
普通の感覚でイヤだから
低学歴知恵遅れなら細かいことは気にしないかもしれない >>941
編集はExcelだけど差分が容易に取れるからバージョン管理の為にcsvしてる たとえばhttpもsmtpもコンテンツ以外は
crlfを除いて普通にぜんぶ0x20以上0x7e以下のテキストでやりとりしてるからな
低学歴知恵遅れなら、自分はそんなの意識しないUA使ってるからなんでもいいというワケ 低学歴知恵遅れは
まずcsvがデータ交換用のフォーマットであることが分かってない デファクトスタンダードのエクセルで
タブ区切りで保存すると
ふつうにこうやって保存されるからな
aho<HT>"boo""foo"<HT>baka
aho<HT>"boo""foo"<HT>baka >>931
TSV にして、データ中に、タブ・改行を使わないのが良さそう
>Excelデータの中の改行はLF。(一行の最後はCRLF)
Linux・Windows 間で、テキスト転送しても、改行コードが変わるから、ヤバイ Excelで直接開くと勝手にフォーマット変換されるのが気に入らないからテキストエディタで開いてからExcelにコピーとかやってるわ >>950
タブはともかく改行は無理
Excel使ってると改行は絶対入れる >>950
> Linux・Windows 間で、テキスト転送しても、改行コードが変わるから、ヤバイ
バイナリ扱いすればいいだけ >>951
拡張子を txt にしてから開いてウィザード動かすか、または 0 で始まる数字だけの文字列は ="0123" のようにして最初から作っておくとうまく行く。 ちょっと荒れたのであまり話題にはしたくないものの
Unicodeの区切り文字を使うのはいい手段だと思う。
ただし思い切り独自規格なので既存の製品には対応できないけどね。もちろん RS、USってのはUnicodeじゃなくてASCIIの制御文字だよ 一般人はCSVファイルをExcelで編集する
となると別にテキスト形式ベースじゃなくても良いわけだ
だとすると誰がCSVファイルを望んでいるのだろうか?
おそらくプログラマなんだろうね。
考えてみればテーブル型データに限っていれば
CSVはJSONよりも効率よくデータを記述できる
JSONだったらこんな感じだしね
[
{"field1": 1, "field2": 2, "field3": 3},
{"field1": 1, "field2": 2, "field3": 3},
]
これがCSVだとここまでコンパクトに纏められる
field1,field2,field3
1,2,3
1,2,3
一般人のことを考えないくていいという前提のものと、もっと良い形式が考えてみよう
それもシェルスクリプトで扱うのが容易な形式
一行ずつ読み取るのだから、一データの終わりはLFであるべきだろう
そしてデータの中には改行は含まず、カンマや制御コードはprintfコマンドで
簡単に解釈ができるよう8進数にエスケープを行う。どうかね?
エスケープの処理を除けば既存のツールでも扱えるだろう
ただ問題があるとすれば、printfで変数に代入する時forkを行う必要があるということだな
これだと時間がかかってしまう。かといって1文字ずつパースするのも時間がかかる
一行ずつ処理するのが可能で、1カラムずつ処理するのも可能で処理に時間がかからない方法はないだろうか >>931
>Excelデータの中の改行はLF。(一行の最後はCRLF)
もし、このCSV を、Linux で扱う場合には、やばくない?
行区切りをCRLF に設定すれば、データ中に、LF があっても問題ないのかな? >>959
別にLinuxでも行区切りがCRLFで行内の改行がLFのアプリは作れるでしょ
標準のアプリと動作が違うけどそういう特殊フォーマットだと思えばいいだけ >>958
fork?どういう処理を想定してるのか? 【審議中】
∧,,∧ ∧,,∧
∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )
| U ( ´・) (・` ) と ノ
u-u (l ) ( ノu-u
`u-u'. `u-u' >>961
a=$(printf 'test')
ビルトインコマンドであってもforkが行われる なんか次から次へと変なテクニックが編み出されていくw 構内放送「直ちに中庭に集合してください」
従業員 (また誰かforkコマンド実行したな…) >>960
> 別にLinuxでも行区切りがCRLFで行内の改行がLFのアプリは作れるでしょ
よく考えたら、シェルスクリプトでもそれなりに使いやすいかもしれない。
readで1行(LFがくるまで)読んで、読み込んだ最後がCRだったら行区切りあつかい
そうでなければ同一行としてあつかえば良いわけだし 8進数エスケープってbashの機能で文字に直せなかったっけ? たとえばエスケープをするのは
US,RS,エスケープ文字自体
↑これでどうだろうか各種エスケープは
\#,\%,\\
これ。
ちなみにあたり前だが 端末の画面に「分かりやすく」表示するときは
\#→水平タブ,\%→改行(LF)
に置換するのがいいだろう。 >>968
echo $'\030'
↑こういう感じやね。 >>971
あー、dashで使えないから頭から抜け落ちてたわw >>970
これはだめだ。
\<US> \<RS> \\
↑これで十分だった。 思いつきだけど、エスケープ文字自体を表すときは別の文字をエスケープして表現するほうが何かと都合がよくないか? >>974
くわしく。
具体例でたのむわ(アホで申し訳ない) 例えば\rsを検索したいときに、\が\\でなければ\rsを検索するだけでよいけど、\が\\のときは見つけたあとに\の数をたどってそれが本当に\rsなのか調べないといけない、とか、
とある場所までシークしたときに、その場所の文字が何なのか、\を繰り返し数えないといけない、とか、
\?はすぐエラーとわかるとか。 >>974
その別のエスケープ文字をエスケープするには
どうすればいいの? >>977
エスケープ文字はあくまで\だけ。
例えば%を使うとして、
rsを表すなら\rs、
usを表すなら\us、
\を表すなら\%、
%を表すなら%、
と記す。とかね >>978
よくわからん。そのルールだと
\rsを表すときは、\%rs
\usを表す時は、\%us
\%を表す時は、\%%
%を表す時は、%
ってことか?
%を検索した時、それが本当の%であるかは
一文字前が\であるかどうかを調べないといけなくて、
\rsを検索したい時は、\%rsで検索しないといけないってことか? >>979
あってるよ。
\が\\の場合は、
\を検索するときは\\を見つけるだけじゃ不十分だけど、
\が\%の場合は、
%を検索するときは一文字前が\でない%を見つけるだけで十分だし、
\を検索するときも\%を見つけるだけで十分なんだ。
同様に、
\が\\の場合は、
\rsを検索するときは\\rsを見つけるだけじゃ不十分だけど、
\が\%の場合は、
\rsを検索するときは\%rsを見つけるだけで十分になる。 どうせRS,USとかの非文字を使うんなら
エスケープ文字もESCでいいんじゃないだろうか。 bashでさ、typesetで関数の中身を出力できるじゃん?
それをevalで評価したら同じ関数が出来上がるじゃん?
これってどれくらい信用できるんだろう?
作成した関数のコードそのままの形で出力されるなら
evalで評価して同じものができるだろうけど、
ぱっとみtypesetで出力するされたものをみると、
改行の位置とか変わって整形された状態になって
関数にはfunctionが頭に追加されてる。
元のコードをどれくらい書き換えるんだろうか?
これ以外になにか変わる事知ってたりする人いない? 今まで人気ないスレだったから全く不要だったわけだが、今後は次スレ立てる安価指定しといたほうがいいか
次回の勢い次第でテンプレ編集で 埋めろって言っても反発されて埋まらん気もするし自分でやるわ このスレも埋まらんうちにすでにCSV荒らしと半角荒らしが次スレ移動してるからな
前スレ使え言っても子供が言うこと聞くわけないから自分でやることにしただけよ このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 60日 10時間 31分 16秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。