シェルスクリプト総合 その36
レス数が1000を超えています。これ以上書き込みはできません。
・特記なき場合、POSIX準拠シェルが既定です(古きBourneシェルはほぼ絶滅しました)
POSIX準拠シェルは(d)ash, bash, zsh, (m)ksh, yash, posh, (p)boshです
参考 https://unix.stackexchange.com/questions/145522/
特定のシェルの専用機能に依存する場合は明示しましょう(特にPOSIX準拠シェルではないfish, (t)csh等)
・POSIX準拠シェルのおすすめは?→多く使われているのはDebian/Ubuntu系のdashです
・bashでいいじゃん→bashがインストールされてない環境があります。環境によってデフォルトシェルの実体は異なります
Debian系 … dash CentOS系 … bash Alpine … busybox ash Android … mksh
FreeBSD … ash Solaris,OpenBSD … ksh
macOS … bash(Single UNIX Specification準拠のために一部動作が異なる)
・macOSはzshなんだよね?→ログインシェルがzshに変わっただけで/bin/shはbash 3.2です
・シェルスクリプトは可搬性を持たせるために可能な限りPOSIXに準拠しましょう
仕様 http://pubs.opengroup.org/onlinepubs/9699919799/
・シバンになにを使えばいいの?→POSIX準拠してるなら#!/bin/sh、bashなら#!/bin/bashか#!/usr/bin/env bash
・bash依存はなるべく避けましょう。自覚なきbashism。シバンが#!/bin/shなのにbashに依存する構文を使っていませんか?
・Bourneシェル(≒POSIXシェル)はPOSIX標準化前にUNIXで使われていたシェルで多くの亜種が存在します
Version 7 UNIXのshに一番近いのはOpenSolaris由来のHeirloom Bourne Shell、次点でSchily Bourne Shellのoboshです
Heirloom Bourne Shell: sh http://heirloom.sourceforge.net/sh.html
Schily Bourne Shell: obosh http://schilytools.sourceforge.net/bosh.html
歴史的資料 https://www.in-ulm.de/~mascheck/
・csh/tcshでのシェルスクリプトは*まったく推奨しません*
参考 http://www.speech-lab.org/~hiroki/csh-whynot.euc
・Linux/UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。Manページや各種リンクを見ましょう
・ワイルドカード・パターンは正規表現ではありません。正規表現の話題は正規表現スレへ
・シェル芸とシェルスクリプトは全く異なります
・シェルスクリプトのことをシェルってゆうな 資源メジャーをカススタとか、視野の狭い奴は生きてて恥ずかしくないのかな なんだか誤解を招く表現ばかりだけど、
https://gigazine.net/news/20210227-posix-parallel-shells-xargs/
2GBをzip圧縮するような重たい処理を並列化する場合は、pthreadよりxargsのほうが、"僅かに"有利なようだ xargsやparallelのほうが簡単
job control的にはparallelのほうが優れてたはず xargsってPOSIXでは作れない機能でも使ってるの?
xargsってFreeBSDでもmacOSでも動くよね? >>5
> 2GBをzip圧縮するような重たい処理を並列化する場合は、pthreadよりxargsのほうが、"僅かに"有利なようだ
当たり前じゃね? スレッド切り替えのオーバーヘッドがないんだから
マルチコア(マルチCPU)なら複数プロセスで実行したほうが速いでしょ? つまりこれはマルチスレッド vs マルチプロセスの話で
一般的にはマルチスレッドの方がパフォーマンスは良いが
マルチスレッドだと共有リソースの排他制御などをする必要があるから
共有リソースがない場合はマルチプロセスのほうがパフォーマンスが良くて
POSIXとはなんの関係もないよねって意味ね >>5
> 2GBをzip圧縮するような重たい処理を並列化する場合は
2GB・・・関係ない
zip圧縮・・・関係ない
重たい処理・・・関係ない
> pthreadよりxargsのほうが、"僅かに"有利なようだ
xargs・・・関係ない
共有リソースがなくて排他制御をする必要がない処理を並列化する場合は
マルチスレッドよりマルチプロセスで実装したほうが、"僅かに"有利なようだ
これが正しいかな POSIXによって能力を制限されてるって書いてあるけど
https://linuxjm.osdn.jp/html/LDP_man-pages/man7/standards.7.html
> POSIX.1c
> IEEE Std 1003.1c-1995. POSIX スレッドインターフェースについて記載している。
POSIXスレッドは1995年?ぐらいに登場した新しいPOSIXで
xargsで使われてるマルチプロセスはずっと前から使えるPOSIXじゃん?
POSIXで実装されてるのにPOSIXで能力を制限とか意味わからん >>8
やりかたしだいやろ。
Apacheなんかは、マルチプロセスモデルよりもマルチスレッドなイベントモデルのほうが(一部を除いて)パフォーマンスが高いとされてる。 Apache(とか)はfork+execのオーバーヘッドが無視できないってのだな
処理単位が1秒以内とかで済む、処理単位がガシガシ来るなら当然
でもまあ>>8は間違ってるかな。>>9で訂正してるようだけど 外国にもPOSIXを勘違いして解釈したPOSIX中心主義みたいな奴がいるんか?w
POSIXは主にC言語のインターフェースなんだから、POSIXで標準化されたコマンド以外でも
POSIXインターフェースを使って作られたコマンドもPOSIXに準拠してることになるんだって
POSIXは、POSIXで規定されたコマンドだけを使って
それ以外はシェルスクリプトで独自開発しましょうって規格じゃねーだろ?
POSIXのC言語のインターフェース使ってコマンド使ってもいいだろ?
そして自分じゃなくて誰かがOSSとかで作ったコマンドもバンバン使っていいだろ?
可搬性?OSSなら可搬性あるるからどこでも使えるコマンドだろ >>10
もしも時間のかからない処理だったら、プロセス生成にかかるコスト差のほうが上回るんじゃね? これどうなんだろ、xargsの方は1プロセス1ファイルだけど、pigzは複数スレッド1ファイル
なんでしょ。
だったらpigzも1スレッド1ファイルで複数ファイルを同時処理するモードがあればどうなのかと。
いずれにせよ元の話はいろんな条件が混ざっていて気持ち悪い感じがする。 GNUのxargsというのでじゃあPOSIXのxargsを考えると、
POSIXのxargsだと例えば引数の数を1にしても(-n1)、プロセスが並列には走らないのか。
waitを使うようなシェルスクリプトとかでGNU xargsの-Pと似たようなことはできるかな?
というわけでこのスレ的な流れに持っていけるかな? w あ、POSIXにあるのかw
ってことはxargsは使っていいけど-Pは
POSIXじゃないから使わないって言ってるのか?
ほんとPOSIX中心主義みたいなこと言ってるなw この部分がどうしても繋がりません
if [ {find "$line" -maxdepth 1 -mindepth 1 -type d | wc -lc } -eq 0 ] ; then
echo "hoge"
fi
これがどうしても出来ません
find "$line" -maxdepth 1 -mindepth 1 -type d | wc -lcだけだと出来るんですが、それを演算式に繋げようとすると私が思いつく限りは何をどういじっても動きません
パイプを更に不等式で繋げるのがよくないと思うんですが
どうしたら直りますか? >>22
{}じやなくて、$()なんじゃないの?
標準出力の内容と「0」を比較するのなら。 $ printf abc | wc -l
0
こうなるって話?
行数を数えるより良いロジックはなんだろうか 何にも該当するのがないかどうかって判断でしかないのに、余計なこと考えたんじゃね
wcを使うのがイケてないって他の行数を数える方法でなのか??
単に出力があるか無いかだけでかと思った -lc ってどっちやねんもあるか。それか?いや違うか
どっちかにしろってのは存在してるけど おお!
なんかエラーがそれっぽくなって近づきました
エスケープ文字で引っかかってる感じですけど
ありがとうです すいません
-lcのcはいつの間にか間違えて入ってしまってたみたいです
ただのミスです
申し訳ない なる。いや、謝るほどでもない。でも、まあ、いいなその姿勢w
頑張れ 0にしてるのは簡易的なテストで
フォルダが1かつファイルが0ならば下層フォルダの階層を全部あげようとしてた感じでした
これもまたもっと良い方法があるのかもしれまん? $ printf abc | grep -c .
でええんちゃうちゃう あ、間違えた
$ printf abc | grep -c ''
だった >>34
>フォルダが1かつファイルが0
??
>下層フォルダの階層を全部あげようとしてた
?
調べるフォルダで内包するのがファイルも無くフォルダ一つ
って言っていることになると思うけど
ありそうなのは、中身空っぽのフォルダ だけど、それとは違うのか
調べるフォルダ(始点のフォルダ)直下のフォルダだけでなくそれ以下の階層でもの空のフォルダを探そうとしてる
ってことなのかなあ こんな感じで
if [ "$source_line_10_first" -ne "$source_line_10_after" ] ; then
i=40
fi
ソースを引っ張ってきて比較するんですが、ソースはやはりエスケープ文字が多いので失敗します
シングルクォテーションでも思いつく限り括弧で括ってもダメでした
変数のエスケープ文字を無視する方法は何か無いですか? >>39
下手なやつが試行錯誤するんじぇねーよ
何がダメかちゃんと書いてるだろうが 文字列に元々含まれてるシングルクォートだけ"で囲って
あとは文字列全体をシングルクォートで囲めばいいのでは コンピューターサイエンスの難問:
・命名
・オフバイワン
・キャッシュインバリデーション
・文字のエスケープ(New!) >>39
その変数はどうやって設定してんの?
変数にいれなきゃダメなの?
cmp < <(...) < <(...)
とか、一時ファイル経由じゃダメなの? 答える方もアホばかりやなw
素人がエスケープが〜と言っていたからって
それが原因だと思うな >>39
質問がよくわからんのだが -ne (数値比較であって文字列比較ではない) の
使い方は意図通りなの? 素人の質問を真に受けるな、相手に情報を出させろ。アホどもが >>45
うわ、バッチリ出来ました
ほんとアホでした
ありがとうございます だから最初から出力されてるエラーメッセージをわかると書いただろ >>49
人にやかましく言う前に、まともな日本語を書け! > ソースを引っ張ってきて比較するんですが
ソースを引っ張ってくるとは?
> ソースはやはりエスケープ文字が多いので失敗します
ソースにエスケープが多いとは
> シングルクォテーションでも思いつく限り括弧で括ってもダメでした
思いつきで書くんじゃなくて、正しい書き方を学べ
> 変数のエスケープ文字を無視する方法は何か無いですか?
変数のエスケープ文字とか意味が全くわからない
この初心者の意味不明な文章を真に受けて
レスするやつがいるんだもんなぁ
アホかと 結局あんなにレスしてるのに一つとしてまともな文を書けないのな >>51
お前の指摘は「-eq を理解している事 前提」なんだよ
右も左もわからん奴は中学生レベルの英語のエラーメッセージを読む精神的な
余裕が無かったり、読んでも正しく解釈できない
お前のやり方は抽象的過ぎるわ「情報小出しにするな」的な基本でもないわで相手に全く届かず
会話に参加できていない
幾ら吠えてもムダ ある文字1文字が標準入力で与えられたときに
その文字がサロゲートペアであるかを判定するシェルスクリプトを教えてください 文字はodコマンドで1バイトずつに変換できる
あとはその数値を調べればいいだけ コンピューターサイエンスの難問:
・命名
・オフバイワン
・キャッシュインバリデーション
・文字エンコーディング(New!) !r posix shell
をDuckduckgoで検索 行頭の任意の数の特定文字を、同じ数の別の特定文字に、sedで置換する方法はあるかな?
たとえば、次のようなテキストを
a aaa
aa aa
aaa a
次のように変更したい。
A aaa
AA aa
AAA a
次のようにだらだら書いたらできるけど、めんどくさいし、任意の数に対応できない。。。
s/^a¥s/A/;
s/^aa¥s/AA/;
s/^aaa¥s/AAA/;
... IPF="対象のファイル.txt"
OPF="結果を出力するファイル.txt"
#最初のフィールドを抜き出し、aをAに変換
cat ${IPF} | cut -d' ' -f1-1 | sed -e "s/a/A/gi" > /tmp/$$0
#残りのフィールドを抜き出す
cat ${IPF} | cut -d' ' -f2-128 > /tmp/$$1
#同列行を連結
paste -d " " /tmp/$$0 /tmp/$$1 > ${OPF}
rm -f /tmp/$$* >>61
いや、サンプルはああ書いたけど、実際はフィールド的じゃない。
任意のテキストも混じってるから、cutはちょっと。。。
sedで任意個→任意個の置換は、やっぱりムリ? 'h;s/ .*//;s/a/A/g;x;s/^[^ ]*//;H;g;s/\n//' $ echo 'aa@aa' | sed -E '/^(a+)/!b;s/^(a+)(.*)\n/\1\n\2/;h;s/^(a+).*$/\1/;s/./A/g;G;s/\na+//'
aa@AA
$ echo 'aabbb' | sed -E '/^(a+)/!b;s/^(a+)(.*)\n/\1\n\2/;h;s/^(a+).*$/\1/;s/./A/g;G;s/\na+//'
AAbbb >>66
最初の方、aa@AA じゃなくて AA@aa だわ 考えてみたら
'/^(a+)/!b;h;s/^(a+).*$/\1/;s/./A/g;G;s/\na+//'
でええかな… 回答、ありがと!
>>63
>>68
要はホールドスペースか。。。
ちぎって置換する感じやな。
いまひとつわかってないので、後で調べて確認してみるわ。 perl -pe 's/^(a*\s)/$1=~s|a|A|rg/e' パイプとリダイレクトなんだけど、どっちを使ったほうがいいとかありますか?
1は cat のプロセスが生成されるだけ無駄なのかな
1. cat file1 | wc
2. wc < file1 連レスすまそ
手癖で1をやっちゃうんだけど、こういう時にまずいとかあったら教えてほしい感じです ないだろう
別次元で
cat file | read a
read a < file
aをなんかする
とかならあるけど
cat file | は古典的定番で今でも悪でもないだろう https://ja.wikipedia.org/wiki/Cat_(UNIX)
なんかウザいw
1995年からそんなのあったんだ
あんま普及してなさそ
wc < file1
も古典だって
<file1 wc
だって。ウザいなw 気にしすぎか、ありがとう!
> cat > newfile
> 新規ファイルnewfileを作成もしくは上書きして、入力したい内容を打ち込み、CTRL+Dコマンドで終了する。入力された内容は新規ファイルに書き込まれる。
これ知らなかったな、同じことをやりたい時は cat << EOF > newfile してたぜ Useless use of cat (UUOC)
昔から有名だな
catなんか使うもんじゃない >>74
> 1. cat file1 | wc
> 2. wc < file1
明らかに2の方が良い
> cat file | read a
> read a < file
特にこの2つだと後者のほうが圧倒的に速い
なぜならcatを使うとシーク不可能になるから
1バイトずつの読み込みになる
< file だとシーク可能だから一定のサイズで読み込むので速い >なぜならcatを使うとシーク不可能になるから〜
www
何言ってるんだか ウザいのはあなたの感想ですよね
事実の話をしましょう >>82
恥ずかしくないの?
sh の組み込みコマンド read は遅い
https://www.allbsd.org/~hrs/blog/2020-03-28-sh-built-in-read.html > 改善するには
ここまで読んで、「最初の shcat の例とコードが違うのでは」と気づいたひとがいるかも知れない。
> 文頭では、次のような例として紹介した。
>
> shcat() { while read L; do echo "$L"; done; }
>
> shcat < foo
> 当たり前だが、こちらは cat(1) を使っていない。先ほどのベンチマークは cat(1) を使っていたので、
> 入力をリダイレクトにしてみよう。
> 実は、シェルの実装によってはシーク可能な記述子を read(2) が読む場合に限り、
> システムコールのバッファを増やすという最適化が入っている。前述したとおり、r
> ead 組み込みコマンドは改行文字を飛び越さないために、1 文字ずつ読む必要がある。
> しかし読む対象がファイルであれば、ランダムアクセスできるので読み出す位置は自由に設定できる。
> そのため、read(2) で大きめに読み込んでから改行文字を探し、その直後に読み出し位置を
> 再設定すれば 1 文字ずつ read(2) を呼び出す必要はない。 www
わざわざ煽って出してきたのが、
自分が何も理解してませんという証明にしかなってないという 連投して抽出までしてるのにww
何も理解してませんという証明にしかなってないよ >>86
なにか言い返す言葉があるなら言い返してみてよ 偉そうな馬鹿に教えてやるとでも思ってるのか
そんな煽りでとかも思ってそうだな、とことん甘ちゃんだな
それと、いつものが確定してんぞw アホな返しっぷりがまたこれがまた、いつものパターンという...w catよりパロディのtacの方がオプションモリモリでcat以上に乱用されてるよな… >>74
catのプロセス分のリソースも無駄だが、
コンテキストスイッチが多発するのが良くない $ cat << EOL > file1
> foo
> bar
> EOF
これでヒアドキュメントを使った複数行テキストの書き込みはできるんだけど、
cat を使わないようにするのって可能なのかな tee を使えば行けることに気付いたけど、cat が減っても tee が出てきたら意味ないよね
そもそも数行程度で cat を無理に外す必要はないことに気付いた
忘れてくれ echo ... >file
でええがな。w
シェルビルトインコマンドやし、ちょっと軽い。 >>96
ちょっと上に出てきたshcatからわかるように
catはほぼ同等のものをシェルスクリプトで実装できる
(ファイルにNULL文字や不正な文字が入ってる場合に少し異なる)
ただし行数が多くなるとループ処理の回数も増えるので
遅いシェルスクリプトよりもcatの方が良い
ちなみにこんな感じね
while IFS= read -r line; do
printf '%s\n' "$line"
done << EOW > file1
foo
bar
EOW それでいいなら最初からそうしてるんじゃないか。知らんけど。 おっと、>>102 は >>101 じゃなくて >>100 に対してだよ。 >>84
比べてないがその用途にmapfileがビルトインなんじゃないの、標準かは知らんけど ああ配列使うんだから標準なわけないか
ストリームじゃないからクソデカだと困るか
でも手放せない 0、標準入力
1、標準出力
2、標準エラー出力
ですよね?
cat <&0 ってやってなんか文字打ったら
標準入力から入力したものを標準出力に出力するから
入力した行と同じ行が出力されるのはわかるんですが
なんで cat <&2 ってやっても同じように
入力した行と同じ行が出力されるんです?
標準エラー出力から入力するってどういう意味なんです? $ tty
/dev/pts/0
$ ps
PID TTY TIME CMD
94 pts/0 00:00:00 bash
232 pts/0 00:00:00 ps
$ sudo ls -l /proc/94/fd
total 0
lrwx------ 1 user user 0 Mar 23 17:56 0 -> /dev/pts/0
lrwx------ 1 user user 0 Mar 23 18:08 1 -> /dev/pts/0
lrwx------ 1 user user 0 Mar 23 18:08 2 -> /dev/pts/0
lrwx------ 1 user user 0 Mar 23 18:08 255 -> /dev/pts/0 あなるほー
紐付いてんのか
POSIXで決まってたりするんかな? POSIXで当然定義はされてる
紐付いてんのか(?)のことじゃないけどな 標準エラー出力から入力した場合の仕様はどこに書いてるの? そんな仕様じゃないよ
<&2 という表記だから、標準エラー出力から入力する と思うのはしょうがないけど、多分思い違いしてるぞ
0<&2 は、標準エラー出力のディスクリプタの複製を標準入力のディスクリプタにするだからな
(その時点での)標準エラー出力のディスクリプタがrwで開かれてる tty(/dev/pts/0) で、それの複製なんだから、以下省略 > (その時点での)標準エラー出力のディスクリプタがrwで開かれてる tty(/dev/pts/0) で、
これがPOSIXの仕様なの? 0<&2 は、標準エラー出力のディスクリプタの複製を標準入力のディスクリプタにする
これ
そこは、疑問と思ってるようだが仕様での動作として何も疑問はないってこと シェルスクリプトの互換性やら#!の書き方の作法互換性やらbashismやら言われてるけど、みんなmailcap/mime-type使わんの? 一応mailcapそれ自体はPOSIX…のはず
ちゃんと各shのmime-typeがそのPOSIXで定義されてるかは不明だけど、IANAとかでは規定あるわけだし
みんな適切に拡張子つければ解決するんじゃないかなって
unix系以外のOSでも対応してるのでPOSIXのみ準拠よりポータブルのはず >>115
なにを言ってるのかわからん。
シェルスクリプトには全部.shという拡張子をつけろとでもいってんの?
/bin/shの実体がdashかbashかわからんって話踏まえてる? >>116
だからこそ
application/x-dash; /bin/dash %s
mime-extensions
application/x-bash; /usr/bin/bash %s
mime-extensions
application/x-dash sh dash
application/x-bash bash
なり指定しておけば面倒はないと思ったんだよ(ごめん書式はあってるかしらん) >>117
だから /bin/sh になにを設定するのか教えて ああ、/binとかに標準で入ってるのは大体.sh付いてないお行儀悪いのばっかだから不味いか…
今時配布するスクリプトには大体付けると思うけど、こればっかは仕方ない もう一つ。
gunzip という"シェルスクリプト" に
どういう設定をすれば良いのか教えて
$ file /bin/gunzip
/bin/gunzip: POSIX shell script, ASCII text executable >>119
実行ファイルには拡張子をつけないのが
"正しい" 作法ですが? >>118
できるだけ互換なのを関連付けるのがベストプラクティスじゃないかな >>122
だから誰がつけるのよ?
シェルスクリプト配布時に作者が
どうやってつけるの? >>123
それはユーザー側でやるべきことだと思うけど、
sudo 要求できるならecho ... >>って手もあるかも >>124
良くない習慣だと言ってる人はだれもいません。
実際にディストリに含まれる実行プログラムで
実装言語の拡張子をつけてるプログラムは一つもありません
Ruby、Perl、Python、拡張子がついてますか?
そもそもさぁ、作者が 拡張子 .sh つけたとしても
じゃあ、これを何で動かせば良いのさ?
/bin/sh が bash だって言ってんだろ >>126
ちゃんとユーザーがどのインタプリタ(*sh、.py etc)で実行するべきか分かるように拡張子を付けるようにしましょう、って提言してる
そりゃインタプリタはインタプリタ名が自身を現してるから付ける必要は無いけど、解釈されるスクリプトには付けない理由は無いでしょう
パス決め打ちに依存するシバンより確実にインタプリタを指定できるわけだし >>127
> ちゃんとユーザーがどのインタプリタ(*sh、.py etc)で実行するべきか分かるように拡張子を付けるようにしましょう、って提言してる
少しは想像力ないのか?
作者が、.sh という拡張子を使って配布して
それをユーザーが、.bash に変更するようにしましょう
とお前が言っていて
そうするとファイル名変わるから、その .sh が
呼び出せなくなるだろ
ぐらいのこと思いつかんのか? 訂正
そうするとファイル名変わるから、その .sh を
内部で呼び出すスクリプトが動かなくなるだろ だいたい「拡張子をつけないのが常識」だから
シバンというものがあるんだがな 落ち着いてるw
そもそも拡張子ではどのインタプリタで動かすのかわからないという前提があるのに
今更何を言ってんだこいつって話 >>128
拡張子は配布者が指定するんだよ、誤解を招いたみたいですまん
ここまでシバかれるとは思わんかった…
実行ファイルに拡張子付けるのが気に入らんなら、ファイル先頭付近のコメントにmime-typeを書いておけば検知されるわけだし、これなら既存の慣習と衝突しない落とし所としてどうだろ? >>132
zshくらい所謂shと違うと、.zshと付いてること多いけど、bashくらいの分かりにくい拡張だとshと付けたくなるのは分かるなあ >>133
> 実行ファイルに拡張子付けるのが気に入らんなら
気に入る気に入らないじゃなくて、拡張子をつけてはならない。
それともお前はwhichコマンドを、which.shに変更しろって言う気か? >>135
規格で決まってるコマンドはそりゃ付けちゃだめだよ
それ以外は気にいるか気に入らないかの問題でしょう
気にならないなら拡張子を付ける、気に入らないならmailcapが見つけられるようコメントにmimeを書く > それ以外は気にいるか気に入らないかの問題でしょう
違う。互換性の問題
実装言語を変えても、互換性は保たれなければならない >>137
なるほど、やっぱ拡張子はダメですね…アホなこと言ってました
コメント自動検知の方は何か見落としないですかね? 結局はシバンを/usr/bin/env bashとかにすれば同じこと >>139
まさにその為にPOSIXへ導入された機構なのではないでしょうか?
mailと付いているのはメール方面で発展したからかな?と気になりますが
先頭付近に書いておけばrun-mailcapが検知してくれますよね、vimのモードラインみたいに先頭5行のような明確な判定法ってないんですかね?
ブラウザなんかはヒューリスティックで上手く決めてくれますけど、 >>140
シバンが先頭占めてるので、GUIで適当にポチポチする人や、中身知らんけど取り敢えず./scriptで実行しちゃう人にはスルーされちゃうんですよね…
イマイチ強制力がないというか
win、linun、unix、macどこでも同じコマンド/クリックで同じように実行できるのは便利なんですが マジ意味不明
どんな手段でもいいからファイルの上の方に書いてある
なにかに従って実行ファイルを動かすツールをもってこい
話はそれからだろ >>143
いや、だからそれがrun-mailcapでは…
ところで、debianのman読むと、最終的にfileコマンドにフォールバックしてmime-typeを決定するとか非常に不吉な事書いてますね!?
うちのfileはシバンから推測(bashとshの区別など)してたと思うので、一旦mailcapを参照する事によるパス非依存性以外に利点がない気がしてきました…
決定アルゴリズムが統一されてないのが課題ですかね
winはもちろん違うでしょうし、unix系でもメーラ/ブラウザは固有の方法で決めてますし
第4のシバンを待つしかないのか! >>144
なら、run-mailcapでいいじゃん。
あとは何をしてほしいんだ?
run-mailcapが要求する何かをすれば終わりだろ うだうだと意味不明だな
シバンは(低レベル)OS API(exec系)でサポートされてるんじゃなかったかな
mime-typeを仮にサポートしてるOSがあってもせいぜい高級APIでじゃないの
何を言いたいのかさっぱりわからん >>146
スレを眺めるに高級環境っぽいので、posixの話はアリかと思いまして
ただ、shを名乗っててもbusyboxとか組み込みだと無さそうな気がしますね(調べてない)
普段コマンドラインに住んでますがすごく便利ですよmailcap
ただ、色々突っ込んで貰ってenvも良さそうな気がしてきました >>147
だから、mailcapがやってくれるんだろ?
シェルスクリプトの作者がやることはなにもないじゃん OSレベルでもなくツールで便利だったからかよ?
自分が便利でしかないことをうだうだうだうだとかよw >>148
シェルスクリプト書く人の話ですよ
実行環境を指定するのに、シバンでパス直打ちか、envか、mailcapか、ということです >>150
だからmailcapとかいう実行環境を指定するために
何をすれば良いのか聞いてるんだが mailcapではないがmime-typeをサポートしてるOSがあるんだが。ある意味OSレベルでサポートしてる
作法が多分違うと思うが、それはそれでmime-typeにある意味固執して使うのかなあ?
めんどくささの方が上回りそうだけどw 既存の色々を知らなさすぎるのに普及運動とかは無理だろうとしか思えない
OSレベルでサポートしてるOSのでもそんなことやってるヤツ見たことないしな >>154
はい、当たり前と思ってたら色々目からウロコで
また勉強して建設的な議論ができるようになったら戻ってきます、皆ありがとう >>137
あるいは、実装の詳細をファイル名に漏出させないため、やな。
ユーザーには関係ないし、開発者のフリーハンドを大きく残しとけるしな。 >>153
普及運動したってmailcapに機能が搭載されてなければ出来ないだろ
だから早くいえmailcapを使うとして
シェルスクリプト作者は何をスレば良いんだ?
実は何もしなくて良いんだろ?w
そもそもmailcap使っても出来ないことだからwww webだとみんなmimeでインタプリタ決めるしな
その方面で育つとカルチャーショック × webだとみんなmimeでインタプリタ決めるしな
○ ウェブサーバーだとみんなmimeでインタプリタ決めるしな
ウェブサーバー側の設定でやるから
スクリプトの作者は何もする必要がない
ウェブサーバー側に相当する何かを用意すればいい 自分で設定するのは面倒、色んな環境の初期設定が揃ってよろしくなってからかな 潔癖症とか完璧主義者とかがUNIX系のもろもろをキモく感じるのはわかる。
とくに最初のころ。
馴れてくると、だいたい気にならんくなってくる。
それがいいことかどうかはわからんけど。w >>126
うちのはデフォルトで/bin/shがzshになってるよ >>166
デフォルトで/bin/shがzshのシステムが有るなら教えて
聞いたこと無いぞ >>167
macOS Catalina
以前は手を入れないとダメだったらしいけど
現バージョンは最初からzshになってる めっちゃ右翼だなそりゃ…
仕方なく読む專だからわからんのだけど、zshもshっぽく振る舞うモードとかあるんじゃないのさすがに限度ってものがあると思うが >>169
単にGPL汚染だったからと言われてるけどApple側から説明はないので不明
bashのv4からGPL3になったのが理由だと思う >>168
> macOS Catalina
どーせそういうと思ったw
なんつーか、みんな基礎的な知識がないよな
あ、macOS Catalinaの/bin/shは(POSIXモードの)bash 3.2.57 だ
これからもずっと変わらんだろうよ >>171
現バージョンはzshになってるよ
確かめてみ なおBigSurは最初からzsh
もうbashには戻らんだろうね >>172
お前が確かめろや
/bin/shって入力して、プロンプトになんと表示されるか言ってみろ ログインシェル と /bin/sh は違うぞ
/bin/sh がなんなの確認してみ >>174
とっくに確かめてるって
BigSurはまだ更新してないから聞いただけだが最初からzsh
わからん人だね
そんに疑うなら自分でやってみ >>176
俺が聞いたのは、プロンプトになんて表示されるかだ
なぜ質問に答えられないのか?
それだけなんだが?
レスするよりタイプ文字は少ないだろ
ああ面倒だw
答えは、sh-3.2
bash 3.2の3.2だ
なにか言い返す言葉はあるか? >>176
確かめてないだろw
冷静にもう一度ちゃんと確かめてみ
>macOS Catalina
>以前は手を入れないとダメだったらしいけど
ってのからも明らかにログインシェル=/bin/shだと思ってるだろうし >>177
されてない
それどころかbashにもリンクされてなくて
ファイルサイズはbashとzsh(ほぼ同じぐらい)の1/10程度しかない
これは/bin/shがbashをベースにPOSIXに準拠するだけの機能に
減らしてビルドした縮小版だからだ >>177
嘘なのかw、マジでそうならなんかおま環くさい
/bin/shがコロコロ変わったら困るから(コロコロ変わる必要もないしな)、なんらか(chsh)でそうなるわけもなく、なんでそうなんか...嘘くさいww
BigSurはまだ更新してないからってことは、Catalinaか...尚更嘘くさい
そんな変なの捨ててクリーンインストールしなさいなww しかしmacOSの/bin/shが、bashやzshの1/10にまでサイズが減ってるとなると
本来のbashに比べて/bin/shは相当機能が削減されたbashだと思うけど何が減ったんだろう?
/bin/shはbashのインタラクティブシェルとしての機能を削っただけかな? そういやqiitaかなんかでmacOSの/bin/shを最新のbashに
アップデートしましょうとか書いてあった記事があったな
Apple版bashじゃなくてbash本家からビルドしてsudoでcpしてw
システム壊す気かって思ったwww >>183
そこまで書いたなら書いてよw
一瞥でなんのこっちゃと思った。それが狙いかも知れんが ふ、黙った所を見ると終わったかね?素人が俺様に敵うわけねーだろ 動いてるなら必要十分だよな
bashはもうバージョン5だし、補完やらのAPIを外部に晒したのが成功して、対話モードが随分良くなった
2つ入れるのはアリだと思う
名前も念の為分けといた方がいいかもしれない(俺はサボったけど)
ただ、呪文のようなパラメータ置換をモリモリ実装してるのは頭おかしいと思う
外部コマンド使え > ただ、呪文のようなパラメータ置換をモリモリ実装してるのは頭おかしいと思う
> 外部コマンド使え
1/1000ぐらいにパフォーマンス下がるぞw
数値は適当だが 外部コマンドはパフォーマンスが大幅に低下するだけじゃなく
改行をうまくあつかないという問題がある
変数には改行を入れられるが、外部コマンドだと行区切りとして扱われる >>191
> macOS Catalina の Bourne 互換シェルとのスクリプトの互換性をテストするには、
> 「/var/select/sh」を「/bin/bash」「/bin/dash」または「/bin/zsh」に変更してみます。
それみてmacOSの/bin/shのサイズが1/10しかない理由がわかったw
man shすれば書いてあったが、macOSの/bin/shはシェル本体じゃなくて
シェル(/var/select/sh、デフォルトは/bin/bashへのシンボリックリンク)
を起動するためのコマンドなのか
どおりでstrings使ったらbashやzshといった文字が見つかるわけだ
/bin/sh をデフォルトのbashから別のシェルに変更したい場合は
シンボリックリンクを変更すれば出来るんだな
ってことはやっぱり単にPOSIXモードが有効になったというだけのbashなのかもな >>191
/bin/dash ってあるから、
次か次の次かで /bin/sh は bash を捨てて(流石に捨てるだろう3ベースのなんて。kshがまだあるから同じように残るか??) の dash になる可能性が大な感じ? >>193
bashからdashに変更すると互換性が壊れるからなぁ
まあそれをUbuntuがやってのけたから
互換性気にしないAppleならやるかもな
保守が続いてるdashに変更するか
それともAppleがbashをメンテンスし続けるか
後者でもほぼ修正はないんだから、大変ではないだろうな >>189
そこまで気にしてなかった、利点はあるのね
しかしパースの曖昧さissueがどんどん上がってたり、使わない部分にまで影響が及ばないか不安になってくる Appleでメンテするのがめんどくさくなって捨てるのは定番
移行を即すためにも最後のあるんだろうし、dashをも入れてるのは 意味がある ことだろう
Appleの準備が終わったら&Appleが移行期間が終わりと見なしたら変わるだろうな
bashに固執することなんてないし bashは機能拡張とかいうレベルのメンテはしなくていいけど
もしかしたらこれから新たな脆弱性が見つかる可能性もあるからね
そうなると古いbashは公式にはメンテされない
Appleが独自で修正を入れる必要がある
/bin/sh(=/bin/bash)はAppleが手を入れてるからGPLv3だと困るとして
まったく手を入れなくていいとなった場合
macOSに新しいbashをバンドルすることはあるだろうか?
つまり古いbashはいずれにしても問題があるわけで更新しなければいけない
だから/bin/shをdashに変更した後、bash5をバンドルするかなってこと?
それが無理ならdashに変更したらbashを削除することも有り得そう
それを見越してzshに移行しろって言ってるのかもな つまりbash用スクリプトはmacOSで動かないわけで、
bashを入れるためにはHomebrewを使わなければならないわけで
そうするとbashからdash(POSIX準拠)に書き直す必要があるんじゃないか?w
HomebrewのインストーラーをRubyからBashに書き直しました!
https://itchyny.hatena
blog.com/entry/2020/03/03/100000
これどれくらいbash依存してるんだろう? Homebrewのインストーラー
https://raw.githubusercontent.com/Homebrew/install/master/install.sh
ざっと見てみたが、結構長いな
配列使ってるところがread -n 1が少し厄介だな
POSIX準拠させるよりもzshで動くようにしたほうがいいのかもしれんな
しかしこれどうやってテストしたんだろうか ふむ read -n 1 = getchのPOSIX準拠コードはあるようだ
https://qiita.com/miminashi/items/ad060c43c130581b412a
getch() {
old=$(stty -g)
stty raw -echo min 0 time 1
printf '%s' $(dd bs=1 count=1 2>/dev/null)
stty $old
}
じゃああとは配列の置き換えが面倒なだけだな こうなったら世界唯一のリードオンリー言語、applescriptで書き直すしかないな arrayも使えないのは正直つらい
コマンドだけど魔改造でびっくらこいたのはlinux版のcolumn.1(kernel.org配布なんで公式のはず)だなあ
linuxなのに-hも--helpも受け付けないbsd版使ってたわ
--jsonとか--treeとかもはやcolumnの域を超越してる 配列なんていらんと思ってるけど、何に使ってるか聞いていい?
できれば難しいケースでw >>204
https://github.com/koalaman/shellcheck/wiki/SC2086
こうやりたいのなら
options="-j 5 -B"
make $options file
こうやればいい
make_with_flags() { make -j 5 -B "$@"; }
make_with_flags file
配列はやっぱり、いらんのよなぁ 単語分割は値にスペースが入ってるときに困るんで基本使わないよ。
その上で配列いらんと思ってる。>>205に書いた通り >>205
ああwikiにもデバッグにもお世話になってるわshellcheck様々
まあそうなんだけど、逆に割りたいところでは割りたい時にも文字列より便利なんだよなコマンド組み立てとか
そもそも俺のは乱用であって、配列本来の用途は添字で引くことでしたね!
mktempしてpaste key valueを流し込み、
grep ^key^I |cut -f2-
で引くとかぱっと思いつくけど、汚え
なんか良い方法あったらご教授頂きたい まずmktempじゃなくて文字列変数でいいな、最大サイズとか規格にありそうだけどとりあえず 配列は普通キーと値を追加して育てるので'key sep val '>>で追記
二度同じキーを入れると複数引っかかるので
tac |grep -m1あるいはtail -n1
とりあえずkey sep>>で空文字が返るでよしとする
でもunsetと区別できない
セパレータはタブよりヌル文字にあたりにしたほうが無難そう
ボロボロ出てくるんで出直してきます… >>207-209
ちゃんと読んでないけど
コマンド組み立てならこんな感じ
[ "$FLAG" = "on" ] && set -- -f "$@"
[ -e "$FILE" ] && set -- --file "$FILE" "$@"
cmd "$@"
添字で引きたいならこんな感じ
set -- a b c
echo $2
grep ^key^I |cut -f2- なら、次のようにすればgrepもcutも使わなくても出来るよ
while IFS="$TAB" read -r key value; do
echo "$value"
done
一般的なプログラムでは配列あったほうがいいけど
シェルスクリプトでやるような内容で配列なんかいらない
ただみんなシェルスクリプトを雰囲気でやってて知らないだけ でも、PerlもPythonもないけど、いれるほどでもない用事のときには、Bashくらいが適当かつ充分だったりするからね。 >>211
そのBashくらいが〜が俺にとっては、Dash(POSIX準拠)で十分なんだよね シェルスクリプトじゃないけど、質問。
makeで、ターゲット実行が成功しても失敗しても、最後に後始末みたいな処理をさせる方法はない?
bashならtrap ... EXITでできるけど。 >>219
ああ、pipefailの意味をやっと理解したわ
bashのinfo何度も通読してるはずなんだけど、last commandのステータスを返すって当たり前じゃね、ってスルーしてた…
限りなくバグに近い仕様ってやつか 互換性オプションはマニュアル読んでも例を見ないと分からない物が多いと思う >>219
ちゃうねん、もう一声!
ひとつのターゲットの中での最後じゃなく、依存関係にあるターゲットでも、並列のターゲットでも、とにかくすべての最後に処理をやらせたいんや。
ちなみに、そのページは見てたけど、流してたわ。w
あらためて見直すと、意義がわかった。
ありがとやで! >>222
「$」がとくにな。。。
make変数とシェル変数と正規表現行末とエスケープで混乱しがち。orz >>223
```sh:build.sh
trap 'echo end' EXIT
make
```
./build.sh >>225
ちなみに、>>219のリンク先にも、.ONESHELLからのtrap+makeがあるんや。
たしかに、make関数とかで引数をこねまわしたら、なんとか思ったことができはするんやろうけど、しかしそれもなあ。。。
ということで、makeはそろそろあきらめる方向。
Pythonスクリプトを検討中。
さっぱりきれいな方法があったら頼むわ! Pythonスクリプトの問題点
1. makeのように依存ファイルに基づいた処理を行うのが大変
2. makeでやっていたような処理はシェルスクリプトで書いたほうが簡潔に書ける
なんでPythonのようなタスクを行うのに
適してない言語を使おうとするのかわからない make相当のもあるし最近良くなったので(PEP517)、python+c拡張のプロジェクトでなら従った方がいい
わざわざビルドプロセスだけpythonで書いて添えるんならやめとけ >>227,>>228
どっちでもないから心配すんな。w
makeはビルド以外でも使えるんやで! >>229
そんなsedはゲームにも使えるんやで!みたいなことを言われてもな
sedで書かれたチェスがもの凄い件
https://softantenna.com/wp/unknown/chess-written-in-sed/
> sedで書かれたテトリス「sedtris」なんてものまであるようです。
自分が得意な言語じゃなくて適切な道具を使いましょうってだけ
make使ってなにかのコマンドを実行してたんだろ?
ならそれはシェルスクリプトが適切な道具だ
Pythonじゃない。Pythonで書くと倍以上にコードが長くなるだろう それもよく言われるけど落とし穴が多すぎる、現にハマってるようだし他の方法を考えた方が なるべく基本ユティリティでやりたくて、makeで融通が効かないタスクの自動順序解決&実行ならtsortを使うのが良い 何がやりたいのか小出しでよくわからんね
makeはtsort+ビルド向けの機能のセットであって、ビルドに使わないなら必要としてるのはtsortの部分だろ 具体的にどうタイムスタンプ(に限らないが)を取ってきてコマンドと結合しtsortにかけ、出力を整形して実行するのか
みたいな事なら答えてやれるし、それがこのスレの趣旨だろう 単にタスクランナーとして使ってるだけかもしれんし、質問者が出してない情報を推測であれこれ言うのはやめよう #!/bin/sh
# >>14
# 外国籍の者が日本人に成り済ますために使う「通名」作成スクリプトを実行し
# 当たり玉を3回以上出した者をPOSIX中心主義者と見なしコレ以降の書き込みを禁じる
KIM=1
while [ $KIM -lt 21 ]
do
echo "$KIM回目"
KIM=$( expr $KIM + 1 )
NAME=$( shuf -e 村 崎 本 田 山 玉 子 -n 1 )
if [ "$NAME" = "玉" ]
then tput setaf 3 && echo "金$NAME"; tput sgr0
else echo "金$NAME"
fi
sleep $(( $(od -vAn -N3 -i /dev/random) % 5 ))
done POSIX中心主義ってあれ生きてるの?
もう虫の息なきがw 移植性や持続性っても、
移植性ってただ他でも動くでしかないし、
持続性ってただ変わらない=古いのに固執でしかないし
メンテナンス性は軽視もしくは考慮外だからな(命名のいい加減さから考慮してないだろうなw)
その面が実務者(新しい人だけど)に公にやんわりとw指摘されて瀕死かな tsortはmakeのような動的依存解決&コード生成に使う発想は無かったわ
確かにスクリプト中でタイムスタンプでソート(sort)してからtsortすればmakeの基本機能はカバーできるが、実行したいコマンドを直接書くのはセパレータの扱いや依存が一つしか書けないなど厄介
書き散らしたシェル関数/コマンド"名"を直列に依存解決してダンプ、リファクタリングの参考にするのには気軽でいい 進捗率表示してくれるpvコマンドってどうなの?
やっぱその分処理遅くなったりする? 見かけ上無引数のシェル関数で包めば、とりあえず簡単に動くコードは吐けるか
あんまりやりすぎるとmakeでタスクランナーと変わらんが >>244
timeするしかない
例え何も処理しないコマンドであっても、パイプに挟んだとたんバッファリングモードの不整合で遅くなることだってある たぶん求められている答えじゃないかもしれないけど…
ことパイプに関しては前後のコマンドすらスループットに大いに関係がある
特に挟まれる前提のコマンドなら、それ単体で遅い速いを言うのは意味がない 進捗確認ツールならそれ自体は多分十分気をつけてるだろ、通信先が病的なら気をつけても無駄だが
遅くて困ってからstdbufとか試せば
どうしても必要なものとは思えないけど、インストールスクリプト等でこだわりがあるなら 確かにこれに限らずパイプ通しただけでもわからんよな
それ用のコマンドだから意識してるとは思うが straceするんだ
ファイルIO想定で書いたけど、ストリームも一応(ロジックそのままで)対応しとくかみたいな奴が腐ったミカン
内部バッファにある程度貯めて処理するのが理想だけど、パイプラインのパーツはそうじゃない
こまめに空パイプ覗きに行って藪蛇ブロック、貯めたデータの処理止まってたり
時々ドバっと書き出すから後続はずっとアイドル
なんかインピーダンスみたいだな リーダ/メイン/ライタの3プロセスで1コマンド構成するのがベストになんだろうが、めんどくさいな…
pvみたいに統計取るだけの奴は、読んだ分をそのまま書き出すだろうから、それ自身が問題起こすことは考えにくいかと
ところで、誰かtime したかー? タスクランナーなら、
Jenkins,
Ruby のRake, Thor,
JavaScript のnpm scripts, gulp 俺は他の使ってるが、単なるオレオレタスクランナーならモダン言語で良いの山ほどあるしな
やっぱり何でもmakeマンには賛同できないわ 複数の言語を使ってるとなんで言語ごとに
タスクランナーを変えなきゃいけないんだよと思う
大したことなんかしないだろ >>255
高度な機能を実装する為にモダン言語使っているというだけで、自分の好きなシェルを指定して、そのシェル文法で書くのが主流だと思うよ
(思う、というのはホスト言語の構文ももちろん使えるから、他人は知らん)
.ONESHELLみたいな汚いワークアラウンドも要らないしmakeよりはbsh Makefileは真のタスクランナー(シェルスクリプト)の
よく使う使い方を書いたサンプルファイルだよw
makeコマンドが入っていれば、makeコマンドで実行できるし
入ってないならMakefileの中を見て
そこに書いてるサンプルを直接実行するもの makeがcで書かれてるからといってcでルールかかない のと同じか
スレチぎみだけどbashで書けるオススメおしえろ > bashで書けるオススメおしえろ
どういう意味?
makeは依存ファイルに基づいてビルドするターゲットを決めるものだけど
その機能を使わないで、ただのタスクランナーとして使うなら
普通にシェルスクリプトにコード書けばいいんじゃん?
よくinstall.shとかあるでしょ?
インストールというタスクを実行してる >>260
ロジック頭から追わなくてもルールベースで書けるってのが意義では、ここだけmake信者の気持ちは理解できる
カジュアル用途なら再コンパイル判定は要らないし、トポロジカルソートだけしてくれれば大体みんな満足でしょう
シェルオタとしては上の方に出てるtsort実装もやってみたくはある >>261
ルールって何?ルールがなにもないんだけど? ごめん、多分タスクランナーという言葉の解釈違いだわ
初めて聞いた言葉なので、>>236の用例を借りました
適切な順序で実行する必要があるコマンドの実行(但し非ビルド用途 >>262
connect: lounch-serverみたいな感じ、これなら生tsortでも済むけど >>263
適切な順番に並べればいいだけじゃん?
例えばmake.shとか作って
task1() { ・・・}
task2() { ・・・}
task3() { ・・・}
cmd1() {
task1
task2
task3
}
"$@"
とか書けば、make.sh cmd1でこの順番通りに実行できるでしょ?
task2がtask3に絶対依存するってものなら
task2の中からtask3を呼び出せばいいだけだし
シンプルな手続き型で書けることを
知らなきゃわからない独自の定義構文で書くのってアホらしいと思う >>265がより簡潔になるというのなら
それを見せてほしいが >>269
適切な順番に並べたのなら書き直さなくていいよ、適切に並べる為の仕組みの話で
あと簡潔というのは各記述の話であってコード全体が簡潔になるという意味ではないぞ…むしろトポロジカルソート直列化後のコードは一般に冗長になる つーかいい実装無いか尋ねてる俺になぜ聞く…
独特のレス見るに月末に初心者イビってた奴か? 適切に並べる為の仕組み?
どの順番で実行すべきかなんて人が知ってる などとautotoolsもcmakeもわけわかんねー事をほざいでおります タイポしちゃった、わけわかんねー、の前に、"も理解できないオッサン"を補って読んでください >>273
autotoolsもcmakeも「発生した問題」を解決するためのツールであって
問題が発生してないのに、使うものではないと言ってます。
タスクランナーごときで問題が発生しますか?
まさにKeep it simple stupidの話だよ
シンプルにしておけ >>275
やっぱ分かってねえじゃん
問題が起きないようアルゴリズムに任せるとこは任せましょう、というツールだよ…
そしてそのアプローチはカジュアルユースにも使えるよね? > 問題が起きないようアルゴリズムに任せるとこは任せましょう
無理です。どちらにしろ人間が依存関係の情報を書かなければいけません。
単に書き方が変わってるだけです。 そういう意見はここじゃやくてそれらのツール、あと
>>252
Jenkins,
Ruby のRake, Thor,
JavaScript のnpm scripts, gulp
のメーリスにでも投稿してくれ
もしかしたら世の役に立たないこともないかもしれん ここまでレスの応酬を続けておきながら、
今更そんなレスをするっていうのは
これ以上言い返せなくなったからということなんですね 昨日結構賑わいあって久々に良い感じの雰囲気だったのに、ID真っ赤にして空気乱してすまんかった
大人げない、反省 >>279
ああもうそれでいいよ、君の勝ち
おめでとう >>281
お前が、俺の勝ちに見えるのなら、そうなんだろうな こいつが絡むといつもこう、目的が↑これが冗談じゃないからな チャンピオンの誕生を祝して専スレを建てよう
敗者も向学のためご一緒にどうぞ それは良い考え。チャンピオンを称えてそうしてくれるとありがたい >>236
当たらずとも遠からず。
目的は、サーバーテスト。
で、テスト終了後にサーバーを始末したかったんや。。。
>>265
そんなんするくらいなら、makefileのほうが万倍マシやな!w
makeと違って、個別ターゲットの指定もできないし。
>>235
tsortを持ち出す教える君は、上から教えたい気持ちが漏れすぎやで!
https://togetter.com/li/1685 >>286
> そんなんするくらいなら、makefileのほうが万倍マシやな!w
> makeと違って、個別ターゲットの指定もできないし。
たった>>265のコードだけで個別ターゲット指定できてるんだが?w
makeの「依存ファイルに基づいてビルドするターゲットを決める」という
メイン機能を使わないなら>>265だけでいい。
シバンがないからこれがシェルスクリプト全体だってわからなかったか?
#!/bin/sh
target1() { echo "target1"; }
target2() { echo "target2"; }
target3() { echo "target3"; }
"$@"
↑これをmake.shとかいうファイル名で作って
./make.sh target1ってやってみ、ちゃんと動作するから
もし ./make.sh target1 target2 target3 みたいに
複数ターゲット指定できるようにしたいなら単にループすればいい
for target in "$@"; do
"$target"
done
お前にとってのmakeの価値はこのたった3行のコードにすぎんよ
一行でも書けるがw
# お前に必要なmakeコマンドの実装
for target; do "$target"; done まさに、それを書きやすくしたのが、
>>252
に書いた、タスクランナー
Ruby のRake, Thor などで、タスクを指定できる。
タスク同士の依存・実行順序も指定できる >>289
まあ実際それらを使っても書きやすくなってないんだけどなw
シェルスクリプトで手に負えなくなる規模ってのを
実際に見たことがないよ たまたまビルドを作る必要があってMakefileにちゃんと依存関係を書いてみたが
やっぱり数個程度のファイルしかない場合は過剰なんだよなw
そしてその依存関係の定義はちゃんと正しいのか見なきゃいけなないという
タスクごとにそのまま書いたほうが分かりやすいっていうね 依存関係の定義なくしたw
正確に言えば依存ファイルの定義だな
依存のタスクは残しているが、依存ファイルはどうでもいいや
タスクを実行したら最初からビルドしなおしても時間はかからんし 矮小化した自分に都合に良い条件でしか考えられない
連投さえして同じとこぐるぐる回ってるだけって馬鹿犬かよ 自分に都合に良い条件で考えるのは足り前
正確に言えば、実際のプロジェクトにいい条件ってこと
架空のプロジェクトを相手にしたってしょうがない プロジェクトってw
想像できませんってだけのそんなレスできるんだから趣味での経験しかないんだろうな
吠えて煩いだけの馬鹿犬だな >>288
all : task1 task2 task3
task1: prepare
task2: prepare
task3: prepare
prepare :
という構成で、タスクは並列可、prepareは超重い、となると、makeが最適解やろ。 >>295
じゃお前が具体例だしたら?
想像できるって言ったんだから言えるよね
それとも口だけ? >>296
task1 &
task2 &
task3 &
wait
でおわりやん prepare無視して勝手に終わりにしてるってとこだろ
無視というかただわかってないからだろうけど そう言われてから出すとしたら等価ではないのをまた出しそうでだな その前にprepareが何なのか言えよ
ただ実行する以外に何が違うのか書いてないのに
あとつけで違うとか言うなよ わかってないこと多すぎなのになぜもそう偉そうなのか >>304
prepareはprepareだろう。その意味意図がわからないのはちょっとなあ
知らないのにそんなに偉そうなのは恥以外の何物でもない、恥の上塗りだな
>>296がそう意図してるのかは不明だが、>>296のでできるのは>>298だけじゃないからな
親切なヒントやったぞ。さあ、どうぞ >>306
じゃあそれ以外の意図があるならそれを書いてくれ
task1関数、task2関数、task3関数 の一行目に
prepare関数を実行すれば終わりだろ? 複数のタスクを指定したときにprepareを一回しか実行しないというのであれば
all関数の最初に一回だけ書いてもいいし
フラグを使って一回だけ実行するようにしてもいい(たった一行で実現可能)
動かしたい通りに書けば良い leftpad事件と同じ匂いを感じててしまうな
われわれ(俺除くw)はこんな簡単なコードも書けなくなってしまったのか? >>284
棲み分けられるか正直疑問だし、御高説垂れにくい初心者スレ的なのはどうだろうか >>308
そんなクソコードに頼らずとも使えるのがmakeなんやで!w >>312
makeはすぐ複雑化するよ
http://quruli.ivory.ne.jp/document/make_3.79.1/make-jp_16.html
C. 複雑なMakefileの例
ここにGNU makeプログラムのmakefileがあり、それは比較的複雑なものです。 このMakefileを見て以下の情報を読み取るのは困難
> ここでは、最初のターゲットなのでデフォルトのゴールは‘all’です。
> この makefileの興味深い特徴は、‘testpad.h’がtestpadプログラムに よって
> 自動的に作成されるソースファイルである点です。そして、その プログラム自身は‘testpad.c’のコンパイルによるものです。
> ‘make’あるいは‘make all’と入力することでmakeが実行可能な ‘tar’、
> テープアクセスを提供する‘rmt’デーモン、‘tar.info’の Infoファイルを作成します。
> ‘make install’と入力すると、‘tar’、‘rmt’、‘tar.info’の 作成だけでなく、それらのインストールも行ないます。
> ‘make clean’と入力すると、makeは‘.o’ファイル、 ‘tar’、‘rmt’、‘testpad’、
> ‘testpad.h’、そして ‘core’ファイルをすべて削除します。
> ‘make distclean’と入力すると、makeは‘make clean’と同じ 削除以外に‘TAGS’、
> ‘Makefile’、そして‘config.status’ファイルも 削除します。
> (明らかではありませんが、このmakefileと‘config.status’は configureプログラムに
> よって作成されたもので、これはtarの 配布プログラムに含まれています。しかし、ここではそれは表示されていません。)
> ‘make realclean’と入力すると、makeは‘make distclean’の ときと同じ削除を行ない、
> さらに‘tar.texinfo’から生成されたInfoファイルの 削除も行ないます。
> さらに、ここでは、配布キットを作成するためのターゲットsharと distも示されています。 Makefileが複雑化するのはビルドする工程が複雑化しているという別の問題の顕在化でしかないでしょ
それと同じことができるシェルスクリプトを書くのとMakefileを書くのとどっちが簡単かって話じゃないの 話題に挙がったついでだけどそこでtsortよ
ルールだけ抜き出して可視化しリファクタリングしなさい >>315
複雑なビルド工程をMakefileだと
・依存関係の定義として記述するのが正しいとされ、シェルスクリプトとしての柔軟性もないので
細切れのタスクが多数できてしまい、見づらくエスケープされたシェルスクリプト等を埋め込むことになる
と言ってます。
Makefileからシェルスクリプトを呼び出すんじゃなくて
シェルスクリプトから(必要な場合に必要な所だけ)makeを呼び出したほうがいいんだよ
そして大抵はmakeはいらない。多くの人がタスクランナーとして使ってるのはそういうこと
本当にmakeが必要なのは、C言語のような古い言語で、ヘッダファイルとソースファイルから
オブジェクトファイルを作ってリンクするような作業の部分だけでしょ?
つまり>>314に書いてあるタスクの殆どはmakeを使う必要がないってこと >>317
見辛いシェルスクリプトコードならファイルにしたらええのに。w そもそもシェルスクリプトでファイル間の依存関係を定義するのに疲れたから make が生まれたと思うんですけど...
あと Makefile があれば make install や make clean が存在するっていうのが分かるのがいいんだよ
プロジェクトごとにシェルスクリプトがあったらどういう引数で読んだらいいかとか分からないだろ? > そもそもシェルスクリプトでファイル間の依存関係を定義するのに疲れたから make が生まれたと思うんですけど...
そうだよ?タスクランナーではなく依存関係を定義するために作られたのがmakeだよ
最初からそう言ってるじゃん > プロジェクトごとにシェルスクリプトがあったらどういう引数で読んだらいいかとか分からないだろ?
俺はそれよりもmakeで実行できるタスクに何があるのかわからんのだがw
make --helpした所で表示されないしな
Makefileみればわかるって?それはソース見ればわかるって言ってるようなもんだし
依存関係を見たいんじゃなくて、makeで直接実行することを目的としたタスクの一覧が見たいんだよ >>300-302から自ら>>304と馬鹿な自分を自己紹介しておいてw
何でそうも偉ぶりたいのか。まともな神経あったらそんな態度は取らないわなあ
さすがだな >>322
「ただ実行する以外に何が違うのか書いてない」に
対してレスはなにかありましたか?
それが答えだよ。 そのレスはコーダーと呼ばれる人種っぽいレスだな
いや、普通の日本語の文もそうだが読み取る能力が欠けてるだけだな
それは矮小化した自分に都合の良い条件でしか考えられないからだな
プロジェクトwwとか関係ないよ、ソース読めないといってるのと同じだな今回は 懲りずに
矮小化した自分に都合の良い条件
かよwそれこそ誰も求めてないぞ >>321
ターゲットを調べたければ、sedでも使ったらすぐにわかるやん。w >>327
ターゲットじゃなくてタスクを見たいんだってw
例えばシェルスクリプトなら--helpして分かりやすいusageが
表示されるように作るだろ?
sedではそのわかりやすさがない。頑張れば作れるだろうが
Makefileでそんなのが用意されてるのみたことないよ Ruby のタスクランナー、Rake, Thor などでは調べるのも簡単
thor list,
thor タスク名
などで、タスクを表示できる
タスク定義の仕方も決まっているので、保守しやすい。
シェルスクリプトでは、各人で書き方を変えるから、保守できない こいつがまともなレスしてるの初めて見たぞ... 明日も雨か? >>330
自分で書く話なら、helpターゲットをつくったらええがな。w
実際、そういうmakefileを、おまえは見たことがなくても、ワイは見たことがあるで? あいつは何を言いたい何をしたいんだかな
何をしたいのかは「勝ちたい/負けたなくない」wwなのは明白だったか >>333
だから結局そうなるから
Makefileに利点がないんだって
中身が複雑になる。そして利点がない。 >>331
thorのコードのほうが複雑になる
シンプルにしておけと言われるのに
なぜか複雑になる だから結局そうなるってwこいつの頭の中身はどうなってんだよ、ほんとに
利点を争ってるwのはそこじゃないだろうにな
「勝ちたい/負けたなくない」wwすぎて誤魔化しがカオス まあ、チャンピオンはこうだからチャンピオンなわけで、誰も勝てないわな
さすがチャンピオン
適当に諦めて試合放棄してもいいよ、挑戦者 それなら勝ち負けじゃなくてmakeの利点・欠点の話をすればいいじゃん
俺はずっとmakeの話をしてるんだが、お前は俺の話しかしてないじゃん もちろんシェルスクリプトのスレだから
makeよりもシェルスクリプトの方が良いっていう話ね
あと今更言わなくてもわかると思うけど、タスクランナーとして使う場合 お前に無駄な挑戦はしないww観客がヤジるくらい許せよ、チャンピオンなんだから
てか「勝ちたい/負けたなくない」wwはお前だけだぞ、言っておくが
すんなり「それなら勝ち負けじゃなくて」って言葉出るのな、さすがチャンピオン タスクランナーとして使う場合の話だったのか、それなら好きなのを使えばいいよ... >>341
自覚してないと思うんだけど、お前のそのレス、またシェルスクリプトの話にはなってない
>>342
最初にそう書いてるんだが
makeからシェルスクリプトを呼び出すとか、Makefileにシェルスクリプトを埋め込むんじゃなくて
シェルスクリプトからmakeを呼び出すほうがいい。もちろんmakeが必要な場合
タスクランナーとして例えばinstallとかcleanが欲しい場合
シェルスクリプトの方がシンプルでわかりやすく書けるわけで
本来makeでやることじゃない >>344
>自覚してないと思うんだけど、お前のそのレス、またシェルスクリプトの話にはなってない
お前自体が逸脱することしょっちゅうあるくせに
昔からなんか困ったらw(黙らせたいとかw)そう言うよなってしか感じませんよ な?またシェルスクリプトの話題が入ってないやろ?そういうとこやで >>342は「好きなのを使えばいい」だろう
なのにチャンピオンは「最初にそう書いてるんだが」って書いておいての次の2行
そういうのは「好きなのを使えばいい」とは言わないだろう
>>342はどっちでもいい、どちらに優位とかは本人次第での「好きなのを使えばいい」だろうと思われるが
だったら、チャンピオンらしいさすがカオスな世界観
未だにMakefileの利点と挙げられてるがのがわかってないなって感じ
簡単に言うと定型フォーマットでルールを記述、オレオレロジック書く必要もないてとこかと思うんだけど、言ってるのは
何故全く理解できないのかなんだか不思議でたまらないカオスな世界
>>346
>>345
な?同じことを平気で何故か言えるだろ? > なのにチャンピオンは「最初にそう書いてるんだが」って書いておいての次の2行
> そういうのは「好きなのを使えばいい」とは言わないだろう
補足しておくな
最初に【タスクランナーの話だと】そう書いてる
そして【タスクランナーの話だと】シェルスクリプトの方が良いと最初に書いてる
何の話なのかをあやふやにして、
他人が言ったことをすり替えようとするのは
お前がよく使う手だ。(何度も指摘されてるだろ?) タスクランナーはシェルスクリプトが良いと最初に言ってるのに
なんで好きなものを使えばいいという話につながるのかわからん
最初から「好きなものを使えばいい」とは言ってないだろう
文章を読めないのか、話をすり替えるのが目的なのか タスクランナーとして使う場合、依存しているファイルがないので
Makefileで使える部分は
task:
↑これだけなんだよ
そしてtaskの中身は、コマンドを羅列するか
シェルスクリプトを"エスケープして"埋め込むことだけ
task: であれば
task() { と書いても数文字増える程度で大差なく、
一番重要なタスクの処理は、
task() {
ここにコマンドやシェルスクリプトを
エスケープせずにそのまま書けるというメリットが有る
}
もちろん task 関数を書いただけじゃ呼び出せないから
それをシェルスクリプトでは呼び出すコードが必要
あー、それがオレオレロジックなんだーって言うかもしれないが
それは>>287に書いた通り
# お前に必要なmakeコマンドの実装
for target; do "$target"; done
たったこれだけ >>348,349
単に「タスクランナーとして使う場合の話だったのか」の部分だけを言っているのか
そして「それなら好きなのを使えばいいよ」はあくまでも否定してる文のつもりかよ
あんな短文を分けて肯定否定してるなんて、わかりづらいわっ
まあ、そこまで読めなかったのは俺にも責はあるけどな
(何で食いついてるのかと思ったら何となく理解した。アレだからだろな、やっぱ)
だから、シェルスクリプトがいい/Makefile使うなwと言ってるのはお前だけだって。他に誰もいないだろう(せいぜい好きなの使えばいいというのだろう、他のも勧めてるのも居るしなw)
そしてシェルスクリプトがいいと言ってる理由がことごとくアレwされてるだろうに、自覚ないようだけど。そういうとこやで(ww)
あとな、シェルスクリプトの話を「してほしい」wなら、
少しはその自分のカオスな世界観wを他人にもわかるぐらいに直しないさいな
まあ「してほしい」wんじゃなくて黙らせたいだけなんだろけど、自ら行ってもいるんだからな
変わらないんだろうから、お前のルールなんて知らんとだけ言っておく > そして「それなら好きなのを使えばいいよ」はあくまでも否定してる文のつもりかよ
知らねーよ。俺が言ったセリフじゃないんだから
言ったやつに言えよ
俺は、タスクランナーとして使う場合は
シェルスクリプトの方がいいとしか言ってない
誰が言ったかを理解してないのか?
それともわざとあやふやにして
全部俺のせいにしようとしてるのかどっちだ? > だから、シェルスクリプトがいい/Makefile使うなwと言ってるのはお前だけだって。
だからなんなんだろう?
技術の話をせーや
俺はシェルスクリプトの話をして、シェルスクリプトの方が優れてると言ってる
お前の反論は、そんなこと言ってるのはお前だ!で
技術的な話が全く入ってない > そして「それなら好きなのを使えばいいよ」はあくまでも否定してる文のつもりかよ
そして「それなら好きなのを使えばいいよ」に対しては あくまでも否定してる文のつもりかよ
だよ。そう読んだか。わかると思うんだがなあ、まあ、なんかすまん
>あんな短文を分けて肯定否定してるなんて、わかりづらい
文を書いたのはお前な、お前の責もあるのは当然だろう。元文を書いた人は何にも関係ないぞ、関係ないのは明らかだろうに、あんなわかりやすいw文 >>351の中と後半に書いてる
わかってないなら、中と後半、そして最後の一文を繰り返すだけだな × そして「それなら好きなのを使えばいいよ」はあくまでも否定してる文のつもりかよ
○ そして「それなら好きなのを使えばいいよ」に対しては あくまでも否定してる文のつもりかよ
↑文を書いたのはお前だろw
まず自分の責任を認めろ >>356
こんな簡単なこともわかってないのか?
シェルスクリプトの話をしろと言ってるのは
シェルスクリプトのコードとMakefileのコードの
比較の話をしろって意味だよ
>>351にコードなんて一つも書いてないだろ
ああ、言い訳はいい。
次のレスは「最後の一文」ではなくコードを書け >そう読んだか。わかると思うんだがなあ、まあ、なんかすまん
わざわざ×○整形してるくせに、次のは読まないんだな
チャンピオンとしては受け取れないのか...w
>>358
すでにされてることを何で繰り返さなければならないのか
お前のルールなんて知らんwオレオレルール押し付けすぎだろう 反論がないからもう一度書くね
タスクランナーとして使う場合、依存しているファイルがないので
Makefileで使える部分は
task:
↑これだけなんだよ
そしてtaskの中身は、コマンドを羅列するか
シェルスクリプトを"エスケープして"埋め込むことだけ
task: であれば
task() { と書いても数文字増える程度で大差なく、
一番重要なタスクの処理は、
task() {
ここにコマンドやシェルスクリプトを
エスケープせずにそのまま書けるというメリットが有る
}
もちろん task 関数を書いただけじゃ呼び出せないから
それをシェルスクリプトでは呼び出すコードが必要
あー、それがオレオレロジックなんだーって言うかもしれないが
それは>>287に書いた通り
# お前に必要なmakeコマンドの実装
for target; do "$target"; done
たったこれだけ カオス化がまた一層酷くになったwので、>>351の最後を繰り返すだけだぞ
続けて欲しい、技術的な話をしたいwだったら変わってみような
(そういえばチャンピオンのもう一つの武器は繰り返し言い張るだな
俺の繰り返し言い張りwも受けてみてほしいものだw) >>361に何一つコメントできないくせにレスだけはするんだよな
自覚したほうがいいよ 「しない」という選択肢もあるんだよ。自覚も何も「わざと」なw
だから、そのカオスの原因を直しなさいよ、「してほしい」wなら >>335
シェルスクリプトでコマンドライン引数処理をするよりも、makefileにhelpターゲットを追加するほうが億倍ラクやで?
複雑になるのはシェルスクリプトのほうや。w >>361
前にあったprepareタスクのような、フローの合理化が、シェルスクリプトでは面倒。
&でbg処理したらええというもんではない。そもそも、並列実行していいかどうかも未定義やし。
まあ、それがプログラムとしてはふつうなんやけど、makeに比べると、makefileがルールとして記述するだけやから、そりゃあかなわんわなあ。w 億倍ww
シレっと煽るねえ(もしくはウィット入れるねえ)
だが、チャンピオンには通じないぞ、マジでそう受け取るぞw >>316
gnuのtsortは-fで視点グリグリできないからあかんね、珍しくBSDの方が便利なコマンド >>365
> シェルスクリプトでコマンドライン引数処理をするよりも、makefileにhelpターゲットを追加するほうが億倍ラクやで?
億倍ラクになるかやってみたら?
じゃあmake.sh版。makefile版よろしくw
#!/bin/sh
target1() { # ターゲット1
echo "target1"
}
help() { # ヘルプ表示
sed -n 's/('') {//p' "$0"
}
for target; do "$target"; done
$ ./make.sh help
target1 # ターゲット1
help # ヘルプ表示
(やる前から同じように書けるはずだって気づかないもんですかねぇ) >>366
> 前にあったprepareタスクのような、フローの合理化が、シェルスクリプトでは面倒。
何が面倒かが書いてない
> &でbg処理したらええというもんではない。
ええというもんではない当理由が書いてない
> そもそも、並列実行していいかどうかも未定義やし。
それはmakeも同じ。makeの並列実行に夢見すぎじゃね?w
Does “make -j” always produce correct result?
https://stackoverflow.com/questions/45453225/does-make-j-always-produce-correct-result
> 依存関係が正しく設定されていないと、間違った順序で処理が行われ、
> ビルドエラーが発生する可能性があります。make通常、複数回実行すると解決します。
> ただし、最善の解決策は、依存関係をリファクタリングすることです。
> それが不可能な場合は、最初から並列makeを実行しないでください。
> 私は古いgccベースのコンパイラ(?1997)を使用していますが、-j2以上でビルドすると、
> スレッドセーフではないかのようにエラーが発生します。
Installation using "make -j" error
https://github.com/espnet/espnet/issues/392
error when run "make -j 12"
https://github.com/google/ihmehimmeli/issues/2 >>367
> だが、チャンピオンには通じないぞ、マジでそう受け取るぞw
安心しろ。億倍はネタだとわかってるぞ
でも数行増えてしまうと考えてるんだろう
実際には0倍だっただけどな >例えばシェルスクリプトなら--helpして分かりやすいusageが
--helpじゃないのか
シェルスクリプトに拘ってるのにスタイルは簡単に捨てるのか
make help
は、それもスタイルだからな。何でもアリなら、何でもアリでええやん こう変えるだけで変更できる簡単なツッコミはいらんて
for target; do "${target#--}"; done 言われたら対応してるだけだな
--target1
は、許すんだな。まさかそんな小手先で来ると思わなかったぞw
何でもアリに変わりないやん 自分の目的なら色々自分スタイルでいいと自ら自己紹介してるのに、他の人がするのは絶対許さないというカオスぶり(というより単に自己中かw)
やっぱりカオスだな、技術的なことwは無駄だなと思わせるだけだなっていう お前単に自分が気に食わないって言ってるだけじゃんw 「一貫性のないのや何もわかってない理解してなさそうなのに」偉そうに振る舞うのに「一貫性のないのや何もわかってない理解してなさそうなのに」部分にヤジ入れてる感想入れてるwだけだな
自分が気に食わないってしか捉えられないお前の思考が浅い(すぐ上のでも顕著なようにw全てに言える)だけだな
まあ単にそう貶めたいだけなんだろうけど、チャンピオンとしては 一貫性がないとかいう主張の中身が、お前が気にいるかどうかでしかない
例えば、git helpでgit --helpと同じヘルプが表示される --helpってお前が言い出してるんだけどな
--helptってお前自身そう思ってたくせに
そういう一貫性だよ、お前自身のな
ちなみに、git helpのはhelpが「gitのコマンド」だからだぞ
なんか残念でしたwと思わないこともない docker helpやgcloudもだな。
サブコマンド系は--helpがhelpサブコマンドになってるのはよくありそう
(実装者の立場で考えるとそれが合理的なのは理解できる) >>379
つまりお前は「俺に文句を言ってる」だけで
--helpでもhelpでも「コードは問題ない」って言ってるじゃん
お前一体何と戦ってんの?コードじゃなくて俺だよねw > ちなみに、git helpのはhelpが「gitのコマンド」だからだぞ
--helpがhelpコマンドへ転送されるのはよくある実装だから
>>373でそうしたよね? なんか一生懸命探してんな、今更
なんか一生懸命辻褄あわせしようとしてる感じでしかないなあ。いつものw
戦うwwwさすがチャンピオン。>>377って言ってるのに、いつも戦ってるチャンピオンは、ホントにもうw (短時間、連投来たなあ。さすがいつも戦ってるチャンピオンw) >>382
>--target1
>は、許すんだな
は?
そういう見え透いたカオスなこと言うんだから、チャンピオンは
なんかhelp(プログラムでのコマンドがある場合)ではしゃいでるwようだけど、自己都合でしかないよw
>>385
何言ってるの?>>377って言ってるでしょ
当然お前だよ。ただし「気に食わない」とか「戦う」じゃないよ。理解できないの? それでコードに問題あるの?問題ないの?
その解決策は自分で思いつけないの?
いいからコードの話をしなよw 質問に質問で返す人の心理について
https://mental-kyoka.com/archives/6137
> しかし、聞かれたくない事を聞かれている不快感を放置することができず、
> 婉曲的ではありますが質問に質問で返すという行為により
> 「その質問の内容は不愉快だからやめてくれない?」と暗に
> 伝えているのだと考えることもできます。
> いわば、「逆ギレ」の一種と表現するのが適当かもしれません。
> また、後述するように逆に質問する行為がうまく行き、
> 会話の主導権を自分が握ることができれば、
> 今度は自分が相手に質問責めをして、今まで受けてきた
> 質問に対する鬱憤を晴らすことも可能です。
なるほど ここ大事だから。お前から聞いてきたんだから、お前が自ら答える責もあるだろう
ホント、自分は例外だな。いつものことだが
もちろんお前(に限らず)がそうしようがお前の勝手だから問題だとは思わんよ
他人のやり方にアレコレダメ出しするお前はどう答えるのか当然先に聴きたくなるのは当たり前じゃん
馬鹿な墓穴掘り質問だから尚更wいつもの浅知恵レスだから尚更尚更、質問したくなるじゃん (また変な浅知恵、何とか貶めたいだけwのをわざわざ探してきてんな) あ、ごめん。先に「質問に質問で返す人の心理について」について読んじゃったw ではもう一回聞くね
それでコードに問題あるの?問題ないの?
その解決策は自分で思いつけないの?
いいからコードの話をしなよw ※ コードの話をしろよといった次のレスがやはり俺の話 え?答えないの?ww
また何度も繰り返す、困った時のフレーズですか? コードに問題はないよ
で、お前はコードに問題あると思ってるの?問題ないと思ってるの?
その解決策は自分で思いつけないの?
いいからコードの話をしなよw
俺はもう答えたからねw 答えてるんですけど
お前が戦う姿勢なのはいいが、ちゃんと読んでくれなきゃ、ずっこけるだけですよw
コードに問題なければいいなら、Makefileで問題なければいいってことになるだろうに
自分だけは例外は許されへんな > 答えてるんですけど
次のレスは、どのレスで答えてるかを書くだけでいいよ 何でそんなに偉そうなんだかなwww
>>391
>もちろんお前(に限らず)がそうしようがお前の勝手だから問題だとは思わんよ >>401
コードに問題があるか、コードに問題ないか、答えてないよね
コードに問題あるかどうかは言わずに、
それでいいよって言ってるだけだよ コードに問題がないなら>>369のmake.shでいいじゃんなw コードに問題がある or 問題がない・・・これはコードの問題
お前がそれでいいと思うならそうなんだろうな・・・これはコードではなく俺の話 訂正
コードに問題がある or 問題がない・・・これはコードの話
お前がそれでいいと思うならそうなんだろうな・・・これはコードではなく俺の話 変な浅知恵でサイト探してからおかしいぞ
大丈夫か?w
クールダウンタイム必要か?
お前が、コードに「問題あるの?問題ないの?」のって聞いてきてるんだから、「問題だとは思わん」が答えになってるだろうに
何をおっしゃってるんですか。マジ大丈夫ですか?
「お前が」「他人のに」「ダメ出ししてるのが」アホみたいなながーいやり取りになる(俺だけではないのは上の方でも)主要因なのに、(Makefileでの利点をいまだに理解しようとしないのは置いておいても)何を自分ので問題ないでしょなんておっしゃってるんですか
カオスw >>407
だからコードに問題がないなら>>369のmake.shでいいという話でしょ?
さっさと終わろうぜw Makefileでの利点はタスクランナーじゃなくて
依存ファイルに基づいて何かを処理するのが得意ってことだよ
タスクランナーとしてならシェルスクリプトの方が得意だって最初に言ったじゃん なに自分だけに都合が良いように誘導しようとしてんだか
そういう見え透いたのは、ホントにもうw浅知恵好きすぎだろう
矮小化した自分に都合に良いというちょっとナツいフレーズ
てか、結論は出てるだろう、なんか必死で逃げようとはしてるけど
コードに問題なければいいなら、Makefileで問題なければいいってこと
で終わること、とっくに終わってることだよ >>410
そう思わないのが居てもいいだろうに(居てもいいとお前自身がもう言ってしまってるようなもんだしなw)、何をそんなに拘って否定してんだか
(Makefileでの利点はお前は今も理解できないのはもうしょうがないとしても) >>411
> コードに問題なければいいなら、Makefileで問題なければいいってこと
シェルスクリプトのコードに問題なければいいなら、Makefileで問題なければいいってこと
ってどういう意味?
シェルスクリプトのコードに問題ないなら
シェルスクリプトのコードでいいでしょ? >>412
だから俺の話じゃなくて、コードの話をしたら?
Makefileの利点の話をしたいんでしょ? 浅知恵はすぐ働くくせに、少しは頭をちゃんと使おうな
コードに問題なければ と言い出したのはなぜか自問してみ
自分の都合の良いだけの良い張り繰り返しだなw シェルスクリプトのコードが問題なければ
>>369のmake.shで問題ないという結論になる
それだけのことだと思うが? >>414
すでに出てる
理解できないお前には無理のようだが。金くれるならじっくり教えてやるぞw すでに出てるものは全て否定したんで
その結果>>369のシェルスクリプトのコードになったんだよ
話の流れを理解してないようだね >>369
シェルスクリプトのオプションの話をしてたはずなのに、ただのターゲットに変えるとか、コスいことすんな!w
ちなみにもともとは、makefileでは「タスク表示」ができない、って不当なクレームがあっただけの話やったもよう。
おまえ、忘れてるやろ?w >>416
>「お前が」「他人のに」「ダメ出ししてるのが」アホみたいなながーいやり取りになる(俺だけではないのは上の方でも)主要因
>コードに問題なければいいなら、Makefileで問題なければいいってこと
>で終わること、とっくに終わってることだよ
お前のの良し悪しなんて本筋とは関係ない、なぜなら、お前が拘ってるのは他人の(Makefile使うな)に対してだろうに
>>418
否定してると思い込んでるのはお前だけだぞ。浅知恵でのでしかないからなw >>419
いえ、シェルスクリプトには問題ないとのことです。はい。
その話は終わりました。 >>419
>おまえ、忘れてるやろ?w
いつものしょっちゅうやってることだけどなww > なぜなら、お前が拘ってるのは他人の(Makefile使うな)に対してだろうに
何の話ですか?そんな話はどのレスでもしてませんよ ほらほら「あくまでも自分の都合の良い言質が欲しいだけ」だろwww >>419
> ちなみにもともとは、makefileでは「タスク表示」ができない、って不当なクレームがあっただけの話やったもよう。
はい、自分で作らないとできませんよね?
間違ってますか? 何を言ってるんだかなあ
今まで散々Makefileなんて使わないでシェルスクリプトでいいだろう(シェルスクリプト書けないのwとかさえ)と、Makefileいいよって言っている人に突っかかってたくせに
ね、
>おまえ、忘れてるやろ?w
いつものしょっちゅうやってることだけどなww 止まれ、アホみたいにながーい要因が無くなった(忘却された)ようで終わりだな > Makefileいいよって言っている人に突っかかってたくせに
Makefileいいよって言ってる人は
どこのレスの話ですか? まさかmakeとか言うんじゃないだろうな、まさかな
何をおっしゃってるんですか、誤魔化すにも馬鹿すぎる誤魔化しすぎですよ >>370
並列実行させたくなければ、makeは-j 1するだけで充分合理的に実行されるんやで?
ところが、シェルスクリプトで>>298みたいなことしたら、かならず並列実行になるがな。w
prepareは重いっつってんのに全無視やし。w
おまえのほうがbgに夢見すぎやろ。w もしかしてこれ>>286ですか?
> >>265
> そんなんするくらいなら、makefileのほうが万倍マシやな!w
> makeと違って、個別ターゲットの指定もできないし。
先にシェルスクリプトのコードが否定されたわけですが
そのシェルスクリプトのコードは問題ないと同意が取れたんですが? >>430
あなたはいらっしゃらないようですよ、もう彼にはw あと、makeの-nとか-qとかのオプションを、シェルスクリプトで簡単にやる方法も頼むわ。 >>431
また見え透いた自分の都合の良いのを出す(ある意味状態を模造)るんじゃないよ >>370
> 並列実行させたくなければ、makeは-j 1するだけで充分合理的に実行されるんやで?
POSIXじゃないので実行できない場合があります
> ところが、シェルスクリプトで>>298みたいなことしたら、かならず並列実行になるがな。w
え?そんな話今はじめて出ましたよねw
並列実行したくないなら & を取るようにしましょう >>433
> あと、makeの-nとか-qとかのオプションを、シェルスクリプトで簡単にやる方法も頼むわ。
簡単だね
makeの-n
DRY_RUN=1
run() {
if [ "$DRY_RUN" ]; then
echo "$@"
else
"$@"
fi
}
run hage hage
-qはタスクランナーとは関係ないな
依存関係があるものに関しては、シェルスクリプトからmakeを呼び出すっていいましたね >>435
> POSIXじゃないので実行できない場合があります
-jオプションの話を出したのはおまえちゃうの?w
まあ、ヤな環境は、捨てるか逃げるかしたらええで。
> え?そんな話今はじめて出ましたよねw
> 並列実行したくないなら & を取るようにしましょう
prepareが重いという前提を無視すんな。w
たとえばprepare1時間、task*は1分だとすると、makeなら1時間3分、シェルスクリプトなら3時間3分やな。。。
おまえは、本当にそれでええと思っとるんか? >>437
まさかそんなふつうかつめんどい対応を、全ターゲットにいちいちやったらなアカンのか。。。
おまえはシェルスクリプトを使う、ワイはmakeを使う。
もうそれでええな。 >>442
なるほど
使い勝手がいいからちょこちょこ(リアルでもw)使うエセ関西人やけど、
「やったらな」ってムズいなと感じ、もしかしたらとちょっと興味が出ただけです
お答えありがとうございましたw >>237
# シェルスクリプトマガジン vol.30
# POSIX原理主義の逆襲
url=$( echo '/M57C8NB70B/pd/koobe-哲寛仲當-03-lov-ンジガマトプリクスルェシ/pj.oc.nozama.www//:sptth' | rev )
/usr/bin/firefox "$url"
xdg-open "$url"
# /usr/bin/google-chrome "$url" revはちゃんと文字単位でひっくり返してくれるんだ?
へぇー >>250
デスクトップ向けlinuxだと4KiBくらい貯めるのかな
改行のありなしやら入出力がターミナルかやら(test -t)で決めてるみたい?
tr -d \\nで改行絞った小さなテキストが延々と出てこなかったりするな
何が起きてるのか正直分からん Standard C Library の FILE の挙動
Cでプログラム書いてみればわかるよ > ・csh/tcshでのシェルスクリプトは*まったく推奨しません*
マジだった。ちょっと興味本位でやってみたら
変数に改行を入れようとしただけで力尽きるとは思わなかったわw >>2の最後の行、ゆうなって馬鹿みたいだから正しい言葉遣いに直してほしいなぁと思うのは私だけ? 言うをゆうと発音するのは標準語
言うをゆうと書くのはただのバカ 半分ネタやろ。
どうでもええわ。
どうしてもイヤなら、次スレを自分でたてて直せ。 >>449
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/setbuf.3.html
これ。書いてある通りそのままの動作だろう。4Kとかデフォルトは C Library による
コマンドで制御できるのは>>248のstdbuf
stdbufのソースは、FILEのこれらは外から制御なんてそもそも考えてないのでトリッキーなことして面白い $SHELLOPTSに「interactive-comments」と入ってるんだけど、これは何?
man bashには記述がない。。。 man bashにもあるやん
# 以降はコメント/無視するだって "いい"も口語なんでauto。ちゃんとposix使ってください >>456
あざっす
システムプログラミングアレルギー(manで2/3出てきたらそっ閉じ)なもんで…
sedとか-u(unbufferd )オプション付いてていいね、チョロチョロ出てくるのも想定してるんだろう
他はstdbuf効くならば試行錯誤って感じで凌いでるけど、もう腹括る時だろうか… >>451
ちょうど'94年のcomp.lang.unixのfack読んでたとこだけどcshナウいぜって空気でノスタルジー
問題のリダイレクト関連は(入れ子)でサブプロセス内/外のリダイレクトを切り分け頑張るアンサーが面白かったです unixはlangじゃねえわcomp.unix.*ですごめん いまもcsh/tcsh使ってる人っているんだろうか?
shが神に見えるんだが
shからすれば、csh/tcshはcmdと同レベル 昔のshはそれはそれでクセがあったみたいだぞ、faqによると
誰もが一度は躓く
cmd |while ..
do change v
done
echo $v
問題ももっと酷くて、whileへ<inすらもアウトだった
そもそもリダイレクトはフォークする必要無いよね?バグみたいなもん?
なおパイプラインはフォークしてナンボなので合理的な設計だと思ってます
オプションlastpipe提供が現実的な妥協点かなと >>460
ちなみに、
unbufferdだけでいいんじゃあって場合、
setbuf -o0 command1 | setbuf -o0 command2 | command3
setbuf -o0 command4 | command5
...
でなくて、冒頭で、
export LD_PRELOAD='/your/location/libstdbuf.so'
export _STDBUF_O=0
ってすると、以下外部コマンドは全て setbuf -o0 をすることになる >>466
環境変数という手があったか
(いざ困るまでは)もちろんバッファはあった方が良いので、exportするスクリプトを書くと親からうっかりsourceしてしまいそうで…
env/インライン代入 パイプライン
にしといた方が安全そうですかね? そもそもsourceしまくるのがお行儀悪いから、そっちを控えるべしなのかな?
何でもシェル関数にしてそれをソースしまくるパッケージを入れてしまって、bash -xオプション付けると何か操作する度に画面が数ページ流れてうんざりした経験が… >>458
ども。
探し直したよ。
あー、$SHELLOPTSではハイフンだけど、manページだとアンダーバーになってんな。。。 >>468
マジに質問したいんだけど
sourceを何をするときに使うコマンドだと思ってる? >>467
>env/インライン代入 パイプライン
stdbufを使うのと変わらないんじゃない
使うの局所化したいんだったら ( ) でサブシェルにするとかかな >>446
URL=$( echo '/swenybb/ten.hc5.enildaeh//:sptth' | rev )
TMP_DIR=~/tmp/5ch; DOC=${TMP_DIR}/index.php; mkdir -p ${TMP_DIR}
wget --output-document=${DOC} ${URL} || exit 1
iconv -c -f Shift_JIS -t utf-8 ${DOC} \
| grep '2021' | awk -F '</a> <br>' '{print $1}' \
| awk -F '</font>]' '{print $2}' > "~/Documents/5ch_dv.txt"
i=1; while true; do
cut --bytes=1-210 "~/Documents/5ch_dv.txt" | shuf -n 2; sleep 10; done URL=$( echo 'fdr.wkwen/ssr/pj.en.oog.hcraes//:sptth' | rev )
TMP_DIR=~/tmp/goo; DOC=${TMP_DIR}/index.php; mkdir -p ${TMP_DIR}
wget --output-document=${DOC} ${URL} || exit 1
iconv -c -f utf-8 -t utf-8 ${DOC} | grep -v 'gooウェブ検索 急上昇ワード' \
| grep 'title' | awk -F '<title>' '{print $2}' \
| awk -F '</title>' '{print $1}' >> "$HOME/Documents/goo_web.txt"
while read KEYWORD; do
URL=$( echo '=yreuq_hcraes?stluser/moc.ebutuoy.www//:sptth' | rev )""$KEYWORD""
firefox "$URL"; sleep $( shuf -i 10-21 -n 1 )
done < "$HOME/Documents/goo_web.txt" Linux(CentOS7)からsshで192.168.1.50(windows)に接続して、grepでD:\samba-backup\tmpの中を探して、
"bk-日付.tar"という名前のファイルがあれば"backup = O"、なければ"backup = O"と表示されるようにしたいと思い以下のようにシェルスクリプトを書きました。
if expect -c "
set timeout 5
spawn ssh administrator@192.168.1.50 cmd /c dir /b d:\\samba-backup\\tmp
expect \"password\"
send \"パスワード\n\"
expect eof
exit
"|grep "bk-$(日付).tar"
then echo "backup = O"
else echo "backup = X"
fi
実行すると"backup = O"と表示されると思ったのですが、"backup = X"と表示されます。tmpフォルダには"bk-日付.tar"という名前のファイルが確かに置いてあります。どうすれば"backup = O"と表示されるようになるのか教えてください。よろしくお願いいたします。 複雑な問題は複数のより単純な問題に分割すればいいんじゃないかな
まずは expect だけ実行して何が出力されるかみるところから始めなよ "|grep "bk-$(日付).tar"
tmpフォルダには、"bk-日付.tar"という名前のファイルが確かに置いてあります
この「日付」って、日本語を使っているの?
基本的に、半角英数字・ascii 以外は、動かないのでは?
日本語には、CP932・UTF-8/16/32 の4つのエンコードがあって、
各OS・ファイルシステム・端末の入出力によって異なるから 中途半端の知識。自分が詳しいつもりになってそう。
素人同然だから1から勉強してね そもそも、Linux から、cmd とか、Windows のコマンドを呼べるの?
Remote Login してるの?
PuTTY, TeraTerm, VSCode のRemote SSH などを使えば? >>480
>Linux(CentOS7)からsshで192.168.1.50(windows)に接続して
って書いてるじゃん
>>478もわかってなさそうだぞ spawn ssh administrator@192.168.1.50 cmd /c dir /b d:\\samba-backup\\tmp
のところを
spawn ssh administrator@192.168.1.50 cmd /c dir /b d:\\\\samba-backup\\\\tmp
にしたらうまくいきました。ご迷惑をおかけしました。 例えば、Windows 10, WSL2, Ubuntu 18.04, Ruby では、
Linux 側から、Windows側のC ドライブへアクセスできる
パス区切りも、/ を使える。
\ では、各端末でのエスケープを考慮しなければならないので、非常に難しい
Dir.glob( '/mnt/c/Users/Owner/Documents/test/**/*.txt' ) do | full_path |
next if File.directory? full_path # ファイルだけを処理する
p full_path
end sshを使うなら、ええかげんにexpectなんかせんでもええようにしたほうがええんちゃう?
鍵ファイルを使えば。 >>484
それは思う
セキュリティ的にも運用的にも楽だし ファイルの中に書いたマーカーの中に別のファイルを挿入するにはどうしたらいい?
例えばこんな感じのファイルがあったとして、<marker>〜</marker>の中身を
別のファイルに入れ替えたい。posixコマンドだけで
aaa
bbb
<marker>
ccc
ddd
</marker>
eee
fff C言語でもどんな言語でも書けるというだけのことなら
私も知ってますが・・・ csplit
cat head anotherfile rest ただ行単位で分割なので適当にタグ前後に改行挿入などよしなに csplitで2回割って3つに、真ん中を捨てcatを想定したが、regexで割れるので<marker>...</marker>を指定して一回で割った方が素直かもしらん
ファイル内に複数回マークアップが現れる時も、マークアップ+1個に割れるのでスケーラブル ファイルに複数回現れるのは想定してませんでしたが
その場合は全部置き換えたいです
中間ファイルを作るのは一時的であっても
想定してないファイルができるので避けたいです >>491
awk で、
行単位で出力制御できる、フラグなども自由に作れる使える
標準入力以外の入力ソースから読める
って、材料あるんだから簡単にできるだろ
>>479って言ってるのに、何、>>491とか言ってるんだかw じゃあsedとかでいいんじゃね、行志向だとフラグ立てる必要があるので面倒だから、一時的にtrで改行を変な文字に置換して一行扱いすると楽
複数回マークアップするなら、非貪欲マッチの為に終わりマーカーを^指定するのを忘れないでね、念の為 >>496
素直な質問者かと思ったらこんなレスしてんのなあ… >>497
オプション--null-dataをつけたらええやん? 今日の発見
何気なく LANG=C の状態で man ping をやったら日本語マニュアルでは出て来なかった -a を発見。
しかし、 "Audible ping. " ってなんだろうと思い、 -a を付けて ping をやってみるが -a なしと違いはない。
何だろうと散々悩んでまさか本当に音が出るのではと思い、ヘッドホンを指して聞いてみたら BEEP 音が出ていた。
(端末に Ctrl+G の出力しているだけの模様)。
これは普通の状態で音が出るようになってないと使えない(というか分からない)機能だな。
ていうか、この機能って需要あるのか? どういう時に使うんだ? (耳は聞こえるけど目が見えない人向け?) 目が見えないなら読み上げとか使うだろうし
ただのユーモアのような気がする >>500
https://lab.kuas.ac.jp/~ippei94da/unixtodaystips/index.html#%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E5%B0%8E%E9%80%9A%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF
まあ、本気でやるならスクリプトを書くところやけど、ちょろっと待ったり確認したりするだけなら? まあBEEPだと鳴るにしても、あんまり便利じゃないから、bellってスクリプトつくって、mpg123で小さなサウンドファイル鳴らしてたなーw
時間のかかる処理動かすときに、;bellとかやってたわw >>500
日本語マニュアルは古いからな
Ubuntu 20.04のbashのマニュアルなんか
英語版は当然bashのバージョンと同じ5.0(2018年)のマニュアルが入ってるが
日本語版だと4.2(2010年)のやつだからな
あとpingに音がなる機能は便利だぞ
pingで音を鳴らしながら断線チェックするんだよ
断線しかかってるケーブルがあれば触った時に音がなったり止まったりするだろ
一人がディスプレイの前にいて「あ!そのケーブル触ったときに繋がりました!」
なんて叫ぶ必要がなくなるから、一人でも作業できる >>805
その最後の為にってのが本当かもね
https://ftp.arl.army.mil/~mike/ping.html
同じこと書いてる。当時は-aは無かったようだが >>506
>>505 の間違い
army.mil って、米軍(組織の一部)のサイトか
軍人か。pingって名付けるのも発想も納得だな 軍関係者、それも技術者研究者ならそんなナワバリとか無いんじゃね
陸軍でも海軍のそういうのは知ってはいるだろう一般知識的な
事故死で亡くなってるのね。世界的貢献度が高いし有名だから残してもいるのかな >>508
全然関係ないぞ、ソナーのって書いてるじゃん?
冷戦時潜水艦戦な小説読めばわかるぞ
まあ、ボケなんだろうけど >>505
ナルほどナルほどw確かに便利だねw
昔、ネットワークエンジニアやってた時を思い出してほのぼのしてしまったw >>508
それはping-pong。
ちなみにping-pongにしようとしたが商標の関係でpongだけになったパターンが。 BSD系のpingは応答があるとき鳴るのとないとき鳴るのと2つオプションがある。 ほんとこの人酷いわ。関わりたくないからここで書くけど
バカにされてる事にも気づかないでしゃしゃり出てきてこのセリフ
https://twitter.com/col_richie/status/1390912236181364737
> 何を隠そう私こそPOSIX原理主義者。
>
> 「藪医者」の語源(の一説)が面白いので紹介しておきたい。
>
> 藪医者とは、高価な薬が買えずに藪から薬草に使えそうな草を見繕って患者に与えていた医者のことだという。
>
> つまり適当にライブラリーを拾って解決を図るプログラマーは藪医者同然ということになる。
じゃあ藪医者ではない凄腕の医者は自分で薬を作ってるのか?
お前だって自分で作らずにPOSIXコマンドを使って解決してるだけだろ
他人の成果を利用してるだけのくせに自分で何も作らずに主義だけでマウント取ろうとするな
藪医者の語源を自分の主義を正当化するために曲解して利用するな
まさにPOSIX"原理"主義者だと思うわ
https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%AA%E3%82%B9%E3%83%88%E6%95%99%E5%8E%9F%E7%90%86%E4%B8%BB%E7%BE%A9
> キリスト教原理主義(キリストきょうげんりしゅぎ、英語: Christian fundamentalism)とは、
> 特にアメリカ合衆国で聖書の教えを硬直的、新興宗教的に歪曲するキリスト教右派、キリスト教根本主義、
> キリスト教会とその教派に向けて使用される。非難、侮蔑の意味合いを持って使用される場合も多い。
https://twitter.com/takapon_jp/status/9068335656
> 原理主義者はやはりイスラム原理主義者も捕鯨反対原理主義者も
> 正義原理主義者の検察もみんな頑固だから、
> 色んな曲解をしながら原理主義の姿勢を崩さない。
> だからこその原理主義者なんだろうが。。。というわけでもう、寝る。
お前が言う交換可能性とかPOSIXでは一切言われていない
POSIXの教えとは無関係なのにPOSIX原理主義者
POSIXという言葉と成果を利用してるだけ
https://twitter.com/5chan_nel (5ch newer account) だな
普段あんなの視界外なのからは何宣伝してんのとも思えなくもない やぶ医者 語源 でぐぐったら一番最初にこれが出てきてワロタw
https://www.kanken.or.jp/kanken/kankantown/trivia/trivia2.html
治療や診断が下手な医者を「藪医者」と言うが、草木が生い茂った「藪」とは直接関係なく、
もともとは「野巫(やぶ)」と書いたとされている。
「野巫」とは、まじないを使ったあやしげな治療しかできない田舎の医者のこと。 POSIX原理主義ももう終わりかねぇ
ネタとしては面白かったよ 例えば微細化技術で消費電力半分になるんだがそのまま消費電力
半分にするかそれともトランジスタ2倍積むかって言われたら
今だったら(dashが必須だったような)組み込み用チップでも
後者をとってWebなりWifiの機能つけてメモリも潤沢になってる
だろうしなあ >>520
選ぶとするならコスト削減になるほうじゃね?
同じコストで性能二倍になるなら
コスト半分にして同じ値段で前と同じ性能のものを売る >>521
んな単純な話やないやろ。
パフォーマンス指向なら性能が高ければ高いほど売りやすいし、原価比率が小さければ下げたところでたいした儲けにならんし、結局、モノにもよるし経営判断にもよる。
つーか、何の話や?w Debianとかパフォーマンスが理由?でdashに変わったけど
今後これが将来bashに変わることってあると思う?
俺はもう無いと思うんだよね
性能的にはbashで良くなったとしても
互換性を理由にPOSIXに縛られちゃった Ubuntuでのことがあったから
まあしょうがないってことだな、ああいうプロダクトでは
bashismもそれでわかったくらいな、いいとか言う話ではないな
その後のUbuntuでもPOSIX縛りではないからな
まあPOSIXでも書けるならPOSIX準拠にするだろうけど、ああいうプロダクトでは しばらくbashだったがdashに変えた。bashのPOSIXモードで動くように書いてたのに動かないやんけっていう
bashism問題に当たった最初のそれなりのスクリプトの数があるプロダクトがUbuntuじゃないのかな
もしくはちゃんと文書化して残したプロダクトかもだが GNU/Linuxだからログインシェル用には必ず入っていそうだが >>523,524 がそもそも何か勘違いしてるだけだな
(>>528も。普段はインタラクティブでdashなんて使ってるのか?)
bashの時でも「ああいう」スクリプトはPOSIX(/bin/sh)準拠で書いてたからな
別に誰も #!/bin/sh でしか書くなとは言ってないだろう。ただなんとなくかそうした方がいい程度だなw
(なんか絶対にとか言う変なのは居るけど)
必要ならbashでもzshでもなんでも好きに書けばよろしい、シバンを適切にしてればいいことだな /bin/shがdashへのリンクになってるだけ
UbuntuでもDebianでもデフォルトのログインシェルはbash
上でも言われてる通りbashなりの拡張機能を使いたいならシバンをちゃんと設定すればいい話でしょ なってるだけが起因なんだがな
というより、bashもなってるだけでもあったろうが、GNUは変なとこで拘るからなあ。素直にPOSIXモードならPOSIX準拠にしていればいいようなもんなのに
なんか他のPOSIXのことでもオレオレの主張は曲げない独自にやるんだというのはあったな
GNU/Linuxはログインシェルはどのディストリでもbashだろうな
変わったディストリはあるかもしれないが
FreeBSDはtcsh、OpenBSDはkshみたいだな。macOSはzshか。BSD系は色々(歴史的に)ありそうだな >>531
/bin/shがdashのリンクになってるだけという話じゃなくて
dashのリンクになっていてそれ以外に変更することはないだろうってことよ
>>532
> 素直にPOSIXモードならPOSIX準拠にしていればいいようなもんなのに
bashの場合POSIXモードにしていても非POSIXの機能が使えちゃうからね
/bin/shをbashにしてもPOSIX制限ができない
シバンを/bin/shにちゃんと設定してるのにPOSIXオンリーのシェルじゃないってのが問題 極論だが古典的なシステムでは /bin/sh は POSIX 準拠でさえないんだから
POSIX 準拠厨はシェバンに #!/bin/dash って書くべき >>535
POSIX準拠厨はPOSIXに準拠するなっていってんの? dash用スクリプトを書くのにbashのデバッグ機能は必須(というほど大したもんでもないが…) >>535
今時の /bin/sh の最低限度がPOSIXなんだよ
POSIX以前の /bin/sh が現役(古いどころではないOSを無理に今でも使ってるではなく、現代的なOSでという意味での)なのはどこにあるの? dashならPOSIX準拠、と信じてしまうのも、経緯的によろしくなさそうやけどなあ。
もうbashでもdashでも、#!に明記したほうがマシやろ。
あとから検索もしやすいし。 >>539
スクリプトはPOSIXに準拠しており
POSIXシェルで動かすことを想定しているのだから
#!/bin/sh でいいだろ
実際に動かすシェルのことは知らん。そんなもん使う環境次第だろ。
スクリプトをmacOSにインストールするか、Debianにインストールするか、
その他のUNIXにインストールするか、そんなこと開発者が知ることなんてできない。
スクリプトがPOSIXシェルと言うだけの話。 >>538
bash じゃなくて dash を使わざるを得ないような極小環境で現役なものはどこにあるの?
正直 bash 拡張使って簡潔に書いたほうがRAMもROM/Storageも少ないんじゃないかと
さえ勘繰ってるわ >>542
メモリやストレージを気にするならBusyBox一択
必然的に使うシェルはBusyBoxに内蔵されてるash
Alpine Linuxのbusyboxは 805.6KB
この中にシェルだけではなくcpやrmやawkなどの
よく使うコマンドが大量に詰め込まれてる Alpineのbashは742.3k、dashは106.3kだな
それからdashを使うのは環境が極小だからと言うよりも
bashがPOSIXに準拠してないからだ >>541
/bin/sh が POSIX 準拠していない bash の環境もあるんだから
POSIX 準拠を期待しているならシェバンは #!/bin/sh と書くべきじゃない
既に /bin/sh が bash 期待のスクリプトも大量に出回っているから
/bin/sh から bash を追い出すのも現実的じゃない
つまりシェバンに #!/bin/sh って書く、イコール bash でも dash でも
動くなんかよくわからない基準でスクリプト書きますよって宣言している
ようなもんなんだから、そんな曖昧な宣言するぐらいならシェバンに
bash だの dash だの書いた方がいいんじゃないか? >>546
> /bin/sh が POSIX 準拠していない bash の環境もあるんだから
だから、それはシェルスクリプトの問題じゃない
bashを使ってるシステム側の問題 #!/bin/sh はシェルスクリプトに書くものだってわかってる? POSIXシェルで書いてる人は、dashで動かすなんて想定してないからなw >>545
いや、今どき組込システムで bash じゃなくて dash 使わざるを得ない程メモリが
逼迫しているか?って話よ
それに busybox だけ使うならそれでいいんだけどセットで使うアプリのスクリプトが
bash 依存だったりして結局 bash もイメージに組み込まざるをえないとかあり得る
(といういかあった)話なわけで >>550
だからPOSIXという互換性のほうが重要ということだよ
ほれみろbash依存のスクリプトなんか書くから困ってる
bash以外じゃ動かんだろ >>547
でも「今からひっくり返せる戦況にもない」こともわかってるよね?
そこを見て見ぬ振りして POSIX が正義だと旗を掲げても無駄しにするだけだよ 今からひっくり返せる戦況ってなんのこと?
すでに/bin/shがdashまたはashである環境が最多になってしまったから
脱bashの流れは止まらないって話? >>551
> bash以外じゃ動かんだろ
スクリプトの動作の互換性という観点ではむしろそこが良いのがわかってない
bash/dash/ash に限定したほうが保守コストは下がるんだよ bashに限定したらダメでしょ?
dash/ashでは動かないんだから dash/ash用(つまりPOSIXシェル)で書けばbashでも動くが
bashの非POSIXシェル機能を使ったら、dash/ashで動かないってわかってますか? >>553
いや bash 依存の #!/bin/sh なファイルがはびこっていてそれを駆逐できないって話なんだが >>557
それはbash依存が問題なのではなくそのファイルが
メンテされてないっていうのが問題なだけ
そのファイルをメンテすればいい
メンテされてるなら
#!/bin/sh を #!/bin/bashに変更するだけ >>558
シェルスクリプトから移植性を取ったら何も残らない
それはもう別の言語で書けばいい >>556
君は(坊主憎けりゃ袈裟まで憎い的な) bashism 死すべしが強すぎて話がそれ過ぎるきらいがあるな
bash 依存のシェバンは #!/bin/bash って書くのは当然
#!/bin/sh は何に向けてるかわからんから #!/bin/dash って明示しようぜって話だぞ? > #!/bin/sh は何に向けてるかわからんから
何に向けてるってPOSIXシェル全てだろ。何を言ってるんだ?
互換性がないならそれはそのシェルのバグであって
スクリプトの問題じゃない #!/bin/dashだったらdash限定になるじゃん
アホなのかな? >>563
ash で動作するけど ash の劣化実装の dash では動作しないスクリプトを排除できるという意味で安全だ
下手に確認取れてない環境で間違った動作されるくらいなら動かない方がマシ >>562
> 何に向けてるってPOSIXシェル全てだろ。何を言ってるんだ?
だからそこに bash 拡張必須な困ったちゃんが混在してて排除しきれない
から POSIX シェルとは言い切れないってさっきから説明してんだろ >>564
dashがashの劣化実装と言うなら、dashで動作テストすればOKじゃん
何を言ってるんだかw >>565
だから何が問題だっていってんの?
bashコードで書く人?
それは書く人の問題だよね
コードの問題になってないよね 私はこのスクリプトをPOSIXシェル用のコードで書いた
ちゃんと他のシェルで動くこともテストした
だから全てのPOSIXシェルで動作する
なので#!/bin/shにするのである
しかし私の中のもう一人の自分がdashでしか動かないかもしれないから
#!/bin/dashにしろというのである
なんて言う話だったら、頭がおかしいとしか思えないw つーかashとdashってほぼ同じでしょ?ashで動作してdashで動作しないことなんてあるの?
あるならdashで動作確認しろってところは変わらんがな 理想主義者 vs 現実主義者
完全主義者 vs 悲観主義者
POSIX主義者 vs こだわらない派
落としどころはないな。。。 POSIXに準拠したコードであれば/bin/shで動くんだから
#!/bin/shにすればいいってだけなんだがな もちろんそれがdashでしか動かないって言うなら#!/bin/dashにするべきだがな
どのPOSIXシェルでも動くなら#!/bin/shでいい ID:1N3VwigT
DebianやUbuntuで書いてあることを読んで出直せ
何もわかってないで自分が思うでしか言ってないだろう >>570
DebianやUbuntuで書いてることはそんな対立を生まない至極もっともなことを書いてあるんだがな >>573
読んで出直したが何も変わらない。
お前がやってるその行為は
「DebianやUbuntuで書いてることを読んだら俺が正しいことが証明された。はい論破」
と言ってるのと何も変わらない
論破合戦がしたいなら、お前が書いてることを引用して
お前が言いたいことを主張しろ >>574
DebianやUbuntuには#!/bin/shを#!/bin/dashにしろとは書かれていない あ、俺に言われてるのと勘違いしたwww
ID:1N3VwigTに言ってるのか お前に言ってねーよ
読めないいつものお前だろ?流石だな
わざと絡まないようにしてたのにwほんとお前はただただめんどくせえやつだな トンチンカンなことを並べてるしwww俺はそんなこと言ってねえのに
つくづくお前ってやつはただただただただめんどくさいだけのやつだなあ アホはほっておいて、まためんどくさいから最初と最後のへ
>>542
>dash を使わざるを得ないような極小環境
イミフ
/bin/sh が dash なLinuxディストリは普通にあるし。なんでそんな環境をと言い出すのかイミフすぎ
>>565
/bin/sh が POSIX shell であることが期待されているのは昔からだろう。どのくらい昔かは知らんがw
fileで #!/bin/sh なファイルがなんて出るか見てみ。fileのデータベースは公衆でメンテされていてのでソレなんだから大多数がそれを期待しているのは間違いないだろう
bashismなのが逸脱してるのとは別の話。bashismな #!/bin/sh は #!/bin/sh とするのは間違いだから #!/bin/bash に正しなさいというのが現在
あとdashにもなんかトンチンカンな難癖付けてるようだが、bashismと問題にしてるDebianがPOSIXから逸脱不足してるものを作るわけがないというのは常識的にわかるだろうにという
まあ、DebianやUbuntuで書いてあることを読んで出直せw > bashismな #!/bin/sh は #!/bin/sh とするのは間違いだから #!/bin/bash に正しなさいというのが現在
その理屈だと dashism な#!/bin/shは#!/bin/dashにしなさいってことになるだろw はぁ?localとかPOSIXにないんだからdashismだろwww バグじゃなのw ashのが残ってるとか
そういうのはdashismだからもちろん #!/bin/dash にすべきだろうな
そんなの使わないのが多いから見過ごされていても不思議ではないかな
他にもあるんだったらDebianに持って行った方がいいぞ。自ら ism を否定してるとこなんだから いや、Debianの明確な仕様だな。どこぞのスクリプトでも使ってるのほぼ見たことないから>>584って言ったけど、すまん
Debianがシェルスクリプト仕様として、POSIXから拡張した数少ない(5つ)うちの一つだな
その5つをあえて使うなら #!/bin/dash の方がいいかもね。Debianではその5つを使うなら #!/bin/sh でもいいとは言ってるけど(他のシェルでも対応してるからとかかな??) dashismは5つもあるのかよw
じゃあだめだな。#!/bin/dashにしないといかんなwww >>580
> イミフ
> /bin/sh が dash なLinuxディストリは普通にあるし。なんでそんな環境をと言い出すのかイミフすぎ
その返しならイミフだろうなぁ
bash さえも入れたくない/Busyboxだけで極力少ないRAM/ROMで動作させる環境であって
PCやサーバではないよ
RAM が限られている環境だと1つでも bash スクリプトがあると dash と bash 両方で RAM を食って
しまうから、それならば /bin/sh を bash にしてしまった方がまだ軽いってなってしまう
そうなってくると「bash で書きたい人はシェバンに #!/bin/bash って書けば良いじゃん」で済まないわけ
で全部 dash 互換で書く必要がでてくる
シェバンに #!/bin/sh って書いてある他人が書いたスクリプトが bash 互換なのか dash 互換なのか
明示されていない以上、#!/bin/sh=dash 環境に移植する場合は書き直すか動作検証する必要がある
動作検証が終わったら #!/bin/dash って書きかえないと、そのファイルを引き継いだ人がまた
同じ作業を繰り返すことになるって考えよ >>586
何がもわからんくせに調べもしないくせに
ismの何が問題かもわからんくせに
自分が納得できないだけかよ、能書き小僧煩い
まあお前が納得できなくてそうするんだったら勝手にしてもいいぞ、その程度のことなんだろし >>587
ん?
>極論だが古典的なシステムでは /bin/sh は POSIX 準拠でさえないんだから
に対して、
>今時の /bin/sh の最低限度がPOSIXなんだよ
に対して、
>bash じゃなくて dash を使わざるを得ないような極小環境で現役なものはどこにあるの?
だよ?流れからイミフだな
で、今度は
>bash さえも入れたくない/Busyboxだけで極力少ないRAM/ROMで動作させる環境であって
と言い出すの?イミフのイミフだぞ(その後の延々としたのもw)
現在は、/bin/sh は POSIX shell というのが大勢、dash はそれになり得るというのが大勢
違うとお前ら個々が思うのは勝手にどうぞだが、それを理解しろと他人に求めるのは筋違いだな
そんなに自説に自信があるならDebianやfileのメーリングリストで問題提起してみ?w >>589
お前は「/bin/sh = dash が正義」って言いたいだけで
碌に文章も読まずに喧嘩さえ売れればOKな返しをしてるだけ
もっとちゃんと読め
話にならん >>590
何を言い出してるんだか
現在最も近い=最適なのがdashというだけだぞ。開発元がそういう姿勢なんだからそういう方向になるようにはするだろうという当たり前に読めそうなもんだが
喧嘩とかお前にそのまま返すわ。お前が何言いたいのかわからんぞ?
>>589でなんでそう返すのかさっぱだわ。喧嘩wに負けたくないだけか?w
しっかし、柔軟性が無いな。その「単なる自説」の拘りぶりは。なんとか原理主義者に通じるものがあるな
同類か? >>591
そもそも 587 の内容は /bin/sh = ash/dash で頑張ってたけど
途中で /bin/sh = bash で行かざるを得ない/組込でも bash
入れざるを得ないなってなった事を説明しているわけで
589 の指摘を言われる所以は無い
君は同じスレのなかの時系列さえ読み解けない程読解力が低いんだよ
ちゃんと読めぐらいいわせろ >>692
そんな急に知識自慢wされても、は?となるだけだよ
そんな自分の頭だけの流れを読めというのは無理があるでしょ
で?何を言いたいの? >>593
いや、だから君は読解力がない/坊主憎けりゃ袈裟まで憎いで会話にならない、と >>593
そのレスから明らかにお前が自分の頭で思ったことが他人にもわかると思ってるな
>坊主憎けりゃ袈裟まで憎い
イミフwまた何を言っているんだか
だからお前は何を言いたいの?そんなイミフなこと言わずに書いてよ
自称読解力があるらしいのになんで俺に言っていること理解できないの?
(自称のそれは多分それは読解力ではなくて妄想力だと思われるけど) >>596
なんで間違えるかなあw
誤 >>593
正 >>595
誤 >なんで俺に言っていること理解できないの
正 >なんで俺の言っていること理解できないの
なんかとてもすまん >>597
>なんで俺の言っていること理解できないの
君は相手をディスる単語は使うが、なぜディスってるのかは説明しないんだから
理解してもらえないのは当然でしょ
「自分で調べろ」「バカと会話するだけ無駄」というレスのは解の一つではあるが
それを使うのであれば書き込んだ後はとっととスレ/板から去れよ /bin/sh が POSIX shell で汎用性があるスクリプトを書きたいというニーズはある
主に/大きなのはディストリかな
Debianは結構前からbashismを問題にしてる、/bin/sh が bash の頃から(でも、bashからdashに代えたのはUbuntuが先っぽいけど)
そういうある意味良き未来へw先導してるのがDebianなんだろし、そこで開発されてるdashにそれに沿った方向性を見るのは普通だと思うんだがな
全体的にwそういう方向性だろうし、俺はそれでいい、別に異論は無い、納得できるってだけなんだがな
ざっと見だけどなんかやたらbashという語が多いようだけど、bash好きなのかな?dashがPOSIXに近い、bashは/bin/shに合わないとか言う俺がbash嫌いだとでも思ってるのか?
>坊主憎けりゃ袈裟まで憎い
って。と妄想するけど?wまたいきなり何を言っているのかでいまだにわからんけど >>598
お前が何を言いたいのかわからんのだもの
なんか説明してくれたけど、全然レスになってないんだもん(>>593)
じゃ、元に戻って>>589の流れのイミフ&イミフなところをちゃんと説明して >>599
> /bin/sh が POSIX shell で汎用性があるスクリプトを書きたいというニーズはある
だからこそ #!/bin/sh じゃなくて #!/bin/dash って書こうよ
/bin/sh が /bin/bash なディストリが残ってる以上シェバンが #!/bin/sh のままじゃ
いつまでたっても bashism の問題は消えないんだ
コマンドがちょっと打てるだけでOSやシェル、その歴史なんて詳しくも無ければ
興味もない連中でさえシェルスクリプトはかけちゃうからとめられないんだ
>>600
その前段で既に話がかみ合ってないしこれは終わりにしよう
かみ合ってないのに話を終わらせなかった俺が悪かった
すまん >>601
>だからこそ #!/bin/sh じゃなくて #!/bin/dash って書こうよ
イミフ。何もわかってないじゃん。読解力あるんでしょ?w
>汎用性があるスクリプト
汎用性がわからんのか?可搬性と言えばいいのか?
だーかーらー、bashはbashismがあるから /bin/bash にしろって別の話だろうが。誰もそれに合わせたシェルを作らない/作れないんだから
お前のような迂闊さんのための話じゃないよ、#!/bin/sh なら POSIX shell で、それに近いのはdashっていう(何度繰り返したらわかるんだかw)
勉強不足でなんか困ったことがあってもそれは自責だな。お前でさえbashismって知っているのにw
>その前段で既に話がかみ合ってない
噛み合ってないもなんも、上のでさえお前は全然俺の言ってること理解してないじゃん
>>589ぐらいのイミフを噛み合うくらい簡単に説明できるだろうにw
まあ、いいよw(ナゾ) 理想主義者は、互換シェルとかであきらめてないで、真shをつくればいいのに。
そうでなきゃ、いずれまた「dashism」が問題になるやろ。w 理想主義者でもないぞ現実主義だろうに
現実的に拡張可能な範囲での拡張なんだろう
POSIXと出されるとなんか変なこと思ってるのとちゃうか?
毒されすぎだろうここに居た/居るPOSIXなやつとかなんとか原理主義者にw >>602
> イミフ。何もわかってないじゃん。読解力あるんでしょ?w
だからディスる(イミフと読解力あるんでしょで煽る)だけで終わらすんじゃなくて
どこが意味不明なのかちゃんと説明してよ
あとシェバンに #!/bin/sh と書いておきながらbash拡張で書く連中に対応する
方法については何度説明しても回答しないね
都合が悪い質問には一切回答しないでディスるだけとかいい加減飽きたぞ >>605
続いて書いてるだろ。読解力あるんでしょ?w
>あとシェバンに #!/bin/sh と書いておきながらbash拡張で書く連中に対応する
お前でさえbashismって知ってるのに何を言ってるの?お前はここでしか見ないのか?
警告的なのはWebにゴロゴロ転がってるだろうに
ディスるディスるって言ってるけど、お前は何を読んでるんだかな。お前が応えられないからと妄想するぞw
なんだマジで>>589だけの話を終わらせるつもりの>>601なのか?w
(>>589の最後を言っておいて自分から「飽きた」とか。まあわからないでもないけどw(ナゾ)) しっかし、自分から俺に「読解力」とか言い出しておいて、自分に返されたらディスる「だけ」とか。続いて書いてるのも読めないで
自己中も大概にしろと言いたい。もしくはよほど自分に効く言葉なのかな?そうだから俺に対して言い出したのかな?w
「読解力」なんてこれから相手に使わない方がいいよwイミフはイミフだから仕方がない自分から>>598すら説明できないそうだからw
と、余談も余談wだけど >>607
まあ...なんちゅうか
誤 >>598すら説明できない
正 >>589すら説明できない
いや...なんちゅうか...いやすまん >>607
読解力ないがだいぶ効いていますなぁ
今後も君だと気づいたらガンガン使っていくよ 頭悪そうなレス
それだけは言いたかったのね。なんでだろうねえw >>472-473
#!/bin/sh
# POSIX準拠のシェルスクリプトはPythonスクリプトよりも寿命が長そうだからいいね
# Chrome拡張のLanguage Learning with Youtube BETA(提供元: Dioco)をインストール
# 字幕対応の動画ページを開いてキーボードのCキーを押す
# Fキーを押して全画面表示
# 画面下、動画の再生時間の横にOFFと表示されているアイコンをクリック
# 英語の字幕ではなくローマ字が表示される場合は、画面下の歯車アイコンをクリックして字幕設定を「英語>>日本語(自動生成)」から「英語(自動生成)」に変更
# 字幕の読み込み終了後、画面右上にある右矢印アイコン(エクスポート)をクリック
# Excelを選択してエクスポートをクリック
# 字幕ファイルのダウンロードが終わったらシェルスクリプトを実行
# pip install pandas openpyxl
python3 -c 'import glob, os, pandas; \
get_filename = glob.glob(os.getenv("HOME") + "/Downloads/*.xlsx"); \
read_xlsx = pandas.read_excel(get_filename[0], engine="openpyxl"); \
read_xlsx.to_csv(os.getenv("HOME") + "/Downloads/time_en_jp.csv", index=None, header=True)'
# cut: 2列目を抽出 | sed: 改行文字を空白スペースに変換
cat "$HOME/Downloads/time_en_jp.csv" | cut --delimiter="," --fields="2" | sed -z "s/\n/ /g" > "$HOME/Documents/en.txt"
cat "$HOME/Downloads/time_en_jp.csv" | cut -d "," -f 1,2 >> "$HOME/Documents/en.txt"
cat "$HOME/Downloads/time_en_jp.csv" | cut -d "," -f 1,3 >> "$HOME/Documents/en.txt"
mv $HOME/Downloads/*.xlsx ~/.local/share/Trash/files
google-chrome "$HOME/Documents/en.txt" \
$(echo "231c177a35b47c080030/smeti/4444nasam/moc.atiiq//:sptth" | rev) \
$(echo "/1873001261/piv4swen/igc.daer/tset/ten.hc5.ibeh//:sptth" | rev) CSV 形式に対して、cut は機能するのか?
データ中に、カンマを含んでいても、正常に抜き出せるのか? >>615
含んでないことを前提にできるならええがな。 https://twitter.com/col_richie/status/1393925115386101766
> 「POSIX原理主義とはPOSIX文書に従うこと」と思われがちだが、
> 我々の定義は少し違う。「POSIX文書が言わんとすることを読み取り、実践する」だ
>
> 例えば、日本国憲法24条の「婚姻は両性の同意のみに基づいて」を、
> 同性婚時代にどう解釈すべきかのようなもの。元の文章に捕らわれ思考停止してはいけない
ほんと、こいつって適当なことばかり言ってるよな
とうとうPOSIX原理主義はPOSIXとは関係ない。POSIXが書いてないことを
独自解釈して自分の都合のいいように言い換えてるって認めちゃってる。
その「我々の定義」は「POSIX原理主義」のどこにも書いてないと言うね
そしていつものように、全く関係ないものにたとえて
虎の威を借る狐作戦
一貫性がない、思いつきだけで発言してる
https://twitter.com/5chan_nel (5ch newer account) 見落としてた
Language Learning with Youtube BETAが出力する字幕にカンマが表示されることがないから
cutコマンドを使ってCSVファイルのn列目フィールドを抽出できてる
sepオプションで区切り文字に'~'を指定してcomma-separated values (csv)ならぬpython-separated value(psv)ファイル
にすれば英文データ中にカンマを含んでいても正常に抽出できるよ
read_xlsx.to_csv(os.getenv("HOME") + "/Downloads/time_en_jp.csv", index=None, header=True, sep='~')' >>618
python使うくらいなら、CSVの処理にはq(-text-as-data)を使った方がいいかな
まFYIということで。 csvはほんとギルティ、特にクオートしてるやつ…
(["'])[^"']*\1やその,版をベースに個別にチューンしてなんとかならん事もないけど
普通に高級ライブラリ(pwshのパーサとか)呼んで見つけ次第tsvに浄化、常にtsvを扱うのがベストプラクティス
タブが嫌ならascii c0 separator svでも何でもcsvよりはマシ テキストにタブが含まれてたら同じやろ。
結局、ダメなときはダメ。
しゃあない。 >>620
つか、CSVに限らず、シェルスクリプトで扱うなら、とにかくTSVでしょう。
だから、他のデータはとにかくまずTSVにしてしまう。
それさえ出来てしまえば、逆に後はどうにでもなるw
またシェルスクリプトでなくても、タブは単独の区切り文字としてはベスト。
まずよっぽどでない限り、フィールドの内容には出てこないから。 >まずよっぽどでない限り、フィールドの内容には出てこないから
一番使われたであろうソースコード記述でもタブを嫌いスペースが主流だったりするしな sed s/^I/taaab/gとかエスケープしとけばいいんでない?(^Iは本当のタブ文字)
sedはc風のエスケープも認識した気がする、クオートしないとshに食われるが
s/'\t'/taaab/gでも多分大丈夫かな >>624
sedでやるなら普通に\tでいいよ。
ただし、grepでは通らない罠
あと複数文字に変換するなら普通に<TAB>とかにしようよw フィールドの内容に出てくるのを想定した場合の話か
ごめんちゃい 値内のタブは代わりの文字に置き換えて、tsvのデリミタにホントのタブ使うってことね
catやらで書き出してもちゃんとテーブルに見える利点は大きい(適宜タブ幅整えれば)
ascii C0のセパレータは認識しないアプリ多いし、vimで開くとかcat -vteしないと正体不明なので筋が悪いか
自分が何使ったか忘れて頭を捻ることになる
taaabでも何でも良いが、タブであることが一目で分かれば便利
その用途に文字列"\t"が標準的な大体記法だからといって、これに置き換えるのは避けたほうがいいかも
どこかで勝手に解釈されかねない
C0のセパレータがまさにdsvの為の文字なんだけれどもなあ…
扱いづらい >>625
おれ環なんだが、<tab>を解釈してしまうアプリ結構あるので避けたい
vimとか >>628
> その用途に文字列"\t"が標準的な大体記法だからといって、これに置き換えるのは避けたほうがいいかも
うん。それはまずい。
そも普通のコマンドで\t解釈しないのはgrepぐらいのものだと思う。
(これ、ほんと凄い罠なんだよw) >>629
まあ、それなら<-tab->とか、なんなら((tab))とか、[[#tab#]]とかでも、いいけどw
んでもtaaabとかはやめようよ、だって見やすくないし、わかりやすくないし、それこそフィールド値として出てきかねない(まあ、スペースが入ってないとかのタイポだろうけれども)しw >>630,631
覚えておく、ありがと
あと標準ツールで\記法を解釈しないのはedだね
edの直系子孫のgrepとsedで異なるのは興味深いね
結局はオレオレ記法に頼るしかないのな…
tsvほどポータブルでないが、bash等配列サポートbshならdeclare(typeset) -pで再読み込み可能なようにダンプしてくれるね
内部的に使うならこれもありかな >>622
> またシェルスクリプトでなくても、タブは単独の区切り文字としてはベスト。
シェルスクリプトにおいてはタブ区切りはベストではない。
なぜなら空白系文字の一つで特殊な処理が行われるから。
foo,bar,baz という CSVは IFS="," read -r f1 f2 f3 で正しく読み込める。
foo,,baz でも正しく、f1="foo"、f2=""、f3="baz" と読み込める。
しかしこれがタブ区切り(タブ文字=<TAB>とする)であった場合、
空白系文字が連続している場合は一つとして扱われるという例外ルールにより、
foo<TAB><TAB>baz という CSV は IFS=<TAB> read -r f1 f2 f3 と読み込むと、
f1="foo"、f2="baz"、f3="" と間違って読み込まれる。 内部的というか、個人的に、だな
個人的にならそれこそモダンなパーサ使えよって話だし、declare等中途半端なハックはやめておこう
ごめん 名前は忘れたけど、シェルスクリプトでCSVを扱うためのライブラリかコマンドを見かけたことがある
awk実装のパーサーを使ってたはず。githubでawk csv で検索して見つけたんだったかな?
まあいくつかあったはず。 たしかシェルスクリプトで扱いやすいように区切り文字を変換する機能とかエスケープする機能とかとかがあったはず 空白文字としてシェルにパース(単語分割)される、って性質もシェルスクリプティングにおいて便利な場面(forで回したり)は多々あるので一概に悪いとは思わないよ
スペースあるならtsvは避けるとか、IFSをコマンド前置代入で弄るとか、ハッキリ区別したいなら値をクオートしてワンステップ分割を遅延させたりとか
tsvは厳密性と利便性の真ん中の立ち位置だね
シェルスクリプティングにおいて、総合的に見ていい形式だと思うよ、(いざバグるその時までは…) >>632
まあ今時のシェル環境なら絵文字も実際なしじゃないと個人的には思う。
ただ、滅多にないといってもポータビリティ損うのは嫌だから自分はやらないがw
>>633
edかw
ありがとう、覚えておく。
>>634
いや、タブが不適切な場合がありうることは、端から除外してないよ。
標準ツールの実装や文字としての意味合いなどから考えて、ベストだと言ってるので、
そういう特殊な状況がありうることは指摘されるまでもないよw
>>636
awk実装なら欲しい、それw
csvparseなんてコマンドも昔sourceforgeにあって、一時期入れてた。C実装だったので、
でかいファイルを扱うときに重宝したけど、あんまりできがよくなかったんで、今は…
あとC++が書けるなら、boostライブラリ(11標準に入ってるかも)でエスケープ処理できる
パーサを簡単に書けるやつがあったんで、それで挑戦って手もあるかもw
自分は、そんなことを考えているうちに、>>619のq(-text-as-data)を見付けてしまったので、
以後はこれに頼ってるw >>623
>一番使われたであろうソースコード記述でもタブを嫌いスペースが主流だったりするしな
カーネルのソースコードは主流じゃないってことですよね、わかります while IFS=$'¥t' readでTSV読むと空文字が飛ばされるんだけど
どうしたらいいの? 絶対入らないであろう制御文字とか別の文字にsedで置換してから処理すればいいんじゃね? その話を>>634でしたんだけど>>639はわかってない気がするねw > 日本語では、「分かる(understand)」と「分ける(divide)」とは同じ字を充てます。つまり理解することと分類するということは同義です。
???
英語では、「分かる(understand)」と「分ける(divide)」とは異なる単語を充てます。つまり理解することと分類するということは全く別です。
となるのでは?w divide も「分類する」という意味に取ることはできる。分類が理解ならば。 綴りが同じでも意味が違う場合がある
意味が同じでも別の綴りで表現することもある
言葉の常識だな >>618だとうまくいかないので訂正する
read_xlsx.to_csv(os.getenv("HOME") + "/Downloads/time_en_jp.csv", index=None, header=True, sep='~')'
ではなくて
read_xlsx.to_csv(os.getenv("HOME") + "/Downloads/time_en_jp.csv", index=None, header=True, sep="~")' #!/bin/sh
# >>614の拡張機能を使ってダウンロードした英語字幕をDeepLで翻訳するスクリプト
# 翻訳すると短いなと思ったら英文の適当なところに改行を入れる
# . $HOME/venv/english/bin/activate
python3 -c 'import glob, os, pandas; \
get_filename = glob.glob(os.getenv("HOME") + "/Downloads/*.xlsx"); \
read_xlsx = pandas.read_excel(get_filename[0], engine="openpyxl"); \
read_xlsx.to_csv(os.getenv("HOME") + "/Downloads/time_en_jp.csv", index=None, header=True, sep="~"); \
read_xlsx.to_html(os.getenv("HOME") + "/Downloads/time_en_jp.html", index=None, header=True)'
mkdir --parents $HOME/Downloads/Excel; mv $HOME/Downloads/*.xlsx "$HOME/Downloads/Excel"
xdg-open "$HOME/Downloads/time_en_jp.html"
cat "$HOME/Downloads/time_en_jp.csv" | cut --delimiter='~' --fields='2' > "$HOME/Downloads/en.txt"
# pandoc "$HOME/Downloads/en.txt" -o "$HOME/Downloads/en.docx"
# 英語字幕の文字数は30分動画で約2万
en_05k=$( cat "$HOME/Downloads/en.txt" | sed -z "s/\n/ /g" | cut --characters="1-5000" )
en_10k=$( cat "$HOME/Downloads/en.txt" | sed -z "s/\n/ /g" | cut -c "4900-9900" )
for subtitle in "$en_05k" "$en_10k" "$en_15k" "$en_20k"; do
if [ -z "$subtitle" ]; then break
else xdg-open $( echo '/pj/ne#rotalsnart/moc.lpeed.www//:sptth' | rev )"$subtitle"; sleep 21; fi; done >>648
#!/bin/sh
# クリップボードにコピーしたurlをファイルに追記
CLIPB=$(xclip -o)
mkdir --parents $HOME/Pictures/ss
echo $CLIPB >> $HOME/Pictures/ss/urls.txt
#!/bin/sh
# 追記したページのスクリーンショットを取得後にログを残してurls.txtを初期化、閲覧編集用のアプリを起動
mkdir -p $HOME/Pictures/ss
while read url
# 書き込む余白を多く取りたければ1280以上の横幅を指定
do google-chrome --headless --disable-gpu --hide-scrollbars --window-size=1280,15210 \
--screenshot="$HOME/Pictures/ss/ss$(date +"%H%M%S").png" "$url"
done < "$HOME/Pictures/ss/urls.txt"
date >> "$HOME/Pictures/ss/food.log"
cat "$HOME/Pictures/ss/urls.txt" >> "$HOME/Pictures/ss/food.log"
: > "$HOME/Pictures/ss/urls.txt"
wine "$HOME/irfanview/i_view64.exe" &
xdg-open $( echo '=q?/moc.ogkcudkcud//:sptth' | rev )"!hatebu あとで読む" >>650
#!/bin/sh
# 区切り文字が^のcsvファイルから3列目を抽出
while IFS='^' f1 f2 f3
do
echo "$f3"
done < $HOME/Documents/file.csv
echo -n "$IFS"
xdg-open $( echo '/pj.oc.ihcinuhc.www//:sptth' | rev )"article/215479" スクリプトのシバンで#!/bin/bashを使うのに抵抗があっていつも#!/bin/shと書くんだけど
#!/bin/shは実際何が呼ばれてるか確認する方法ある? Ubuntu 18.04 では、
file /bin/sh
/bin/sh: symbolic link to dash
readlink -f /bin/sh
/bin/dash
ls@ -l /bin/sh
lrwxrwxrwx 1 root root 4 5月 21 2019 /bin/sh -> dash
ただし、ls の特定のオプションは書き込めないので、@を入れました
ll /bin/sh
lrwxrwxrwx 1 root root 4 5月 21 2019 /bin/sh -> dash*
ただし、ll は、~/.bashrc 内で定義されているエイリアス。
alias ll='ls -alF' dashいいよね
time /bin/sh looooop.sh
という手も…
制御構文と算術並べて回すとbashの6倍〜くらい速い
もしbashのshモードなら、あえてshとして呼ぶ意味は多分ない
shにリネームしても--posixで呼んでも速くなったりはしないので
単に機能制限するだけ bashの--posixなら多分機能制限しない
posix準拠の動きに変えるだけ >>656
なくはない。
何らかのbシェルベースのシェルが起動するコトを期待する、と言う意味がある。
そこがつまり#!/bin/dashと書くな、という理由だよ。
ポータビリティというのは結局スクリプトを書く側が担保してやるしかないものさ。 こんなん出ました
dashだそうです
root@rock64:~# file /bin/sh
-bash: file: command not found
root@rock64:~# readlink -f /bin/sh
/bin/dash >>659
なに?ubuntuってfileコマンドないの?w
うへ。何のパッケージインストールすりゃいいんだ?w
打てば教えてくれるのか?w
まあ、滅多に使わないけどさ…w $ apt-file search -x '(/usr)?/bin/file$'
file: /usr/bin/file >>660
最近はクロス環境とか多いからfileは結構出番ないすか? これどれのバイナリー? みたいな クロス開発で異なるプラットフォームのバイナリが
バラバラにばらまかれて調べないといけなくなる状況がわからん
ちゃんとディレクトリとかファイル名とかでわけて
混ざらないように作れよ
適当にやってるからわからなくなるんだよ >>660
debianベースらしいけど見ての通りrock64というシングルボードコンピュータ用だから
色々省かれてるんでしょうね
まあaptで標準的なものは入るので なるほどw
いろいろありがとう >>661 >>664
RedHat系でずっと来てるもんで、ubuntuは新参でして…w
結構、細かいところでググぅっとなるw これを機にPOSIX準拠を目指すといいでござる
ただしPOSIX原理主義だけは見てはいけないでござる
あれはエセPOSX宗教でござる プログラムの勉強のためにshellのコマンド(ex cd・cp・find ...etc)が
どう書かれているか中身を見たいのですが、バイナリのため文字化けしてて見れません。
これを人が読めるように戻すにはどうしたらよいでしょうか?
またshellのコマンドはプログラム言語は何で書かれているのでしょうか? $ objdump -d -j .text /usr/bin/cp >>667
> shellのコマンドはプログラム言語は何で書かれているのでしょうか
だいたい全部と言っていいほど、Cだな
ほぼ全部OSSなんだから、全てのコマンドのソースがネットに普通に置いてある オープンソースとそうでないものがあって、そもそもはオープンソースでない方が元。 お前が何を噛みついてるのかわからん
お前がズレてるんだろうがぁ >>673
イミフ。何を言いたいの?
shellのコマンド(ex cd・cp・find ...etc)=一般的なコマンドは、>>669の通りだけど
OSSでないそうでないものって何? >>667
それらの基本的なコマンドはLinuxが作ってるんじゃなくて
GNUが作ってる。Linuxそれを採用してるだけ
それらの基本的なコマンドはだいたいcoreutilsの中に詰め込まれてる
https://github.com/coreutils/coreutils/tree/master/src
ただし一部は別だったりする。例えばfindはfindutils
cdはシェルで実装されてるからbashとかのソースコードを見ないとわからない
Linux以外を見たければそのOSを作ってるサイトとかに書いてある >>674
世界で一番最初に作られたcpを見つけだせ!
とかいいたんじゃね?www しかしオープンソースじゃないcpってあるんだろうか?w
unixのソースコードも公開されてたよね? >>677
それでも、イミフだわあwOSSやんww
最初の(?)UNIXもソース提供だったな。それもネットに丸ごと今でもあったりするな System V とか Microsoft Xenix とか BSDI のコマンドとかだったりして >669 676
ありがとうございます。GitHubでソースコード拝見しましたが
C言語難しいですね。 標準出力の速度を制限したり、通信速度を表示するコマンドってないでしょうか? .bashrcのaliasでnohupしたいんだがどう書けばいいの?
これだと上手くいかなかった
alias unko='sudo nohup sh -c '¥''time /unko/unchi.sh '¥'' &' >>689
それって sudo してるからパスワード入力が必要になるが、最後に & 付いてるからシェルに戻って来ちゃうからうまく行かんのでは?
普通にコマンドラインから入力してもうまく行かんと思うんだが。1度sudoで何かを動かした後でパスワード入力しなくて良い状態になっている時ならできるだろうけど。 >>690
確かに!
事前に試した時はその前にsudoしてたからパスワード聞かれなかっただけだわ sudo でワイルドカード使いたいときって
sudo sh -c "hoge *"
をイディオムだと思って使うのが良いですかね?
他のやり方ってありますか? >>692
ワイルドカードの使いかたによるやろ。
ワイルドカード処理を自分で行うアプリ(gitとか)なら不要やし。
イディオムではなく、ワイルドカード処理をどれに任せるのかを考えるべき。 イディオムってなんだよ? 何も考えたくないって言ってんのか?
正しいコードを書くだけの話だろ その「正しいコード」とやらが、初心者にはちょっと難しいことはわかる。
凝ったことをやるときに、シェル組み込みのコマンドや機能は混乱のもとやからしゃあない。 俺が突っ込みたいのは「イディオム」って言葉だよ
仕組みを理解したくないってのがバレバレなんだよ
上司「なんでこんなコードにしたの?」
馬鹿「知りません。イディオムです!」
っていいたいのバレバレやろ? すみません
sh -c は何も sudo でワイルドカードを使うためだけに存在する構文ではないので、イディオムと申しました sudoが使えるユーザが利用者で、実行時にパスワードを求める想定です
このときにワイルドカードを使うための、その「正しいコード」とはどのようなものですか、というのが質問です sudoでもワイルドカード使えるし
echo /etc/*.conf
ってしてみろ
shellの機能を使ってるのがわかってない
shellのオーナーはrootじゃなくユーザー 正しいコードを聞くんじゃなくて、
シェルスクリプトを勉強しろって言ってんの
コード聞いて終わりにするだろ
上司「なんでこんなコードにしたの?」
馬鹿「知りません。5ちゃんねるでこれが正しいって聞きました!」 >>699
なんのためのsudoなの?w
起動側のワイルドカード処理ではダメなケースが多かろう。 >>700
ほっとけよ。
それでもべつにええがな。
そもそも、ムリなヤツにはムリやし、できるヤツなら勝手にやる。 どの回答も想像を絶するレベルの低さでワロタ
>>693
どれに任せるかって、質問者が想定してんのはフツーにシェルだろ
>>699
アホ
>>700
何に発狂してんのか分からんが少なくとも質問者の「イディオム」って語の使い方は正しいし、お前は何ら質問に答えていない
分からんなら無理してレスすんな
>>692
こだわりがあって避けたいのでない限りそれで良い
一般に使える、記述量が少ないあるいは分かりやすいやり方は特にない
あともう分かってるだろうがこのスレ終わってるからわざわざここで質問するな どこがイディオムなんだ?ただのワイルドカードだろ
*がワイルドカードで終わる話なんだが?
うん。はいおわた。そこにイディオムはありません。
https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%87%E3%82%A3%E3%82%AA%E3%83%A0
イディオム(英語: idiom、フランス語: idiome、ドイツ語: Idiom)とは、
単語における一定の配列での連結の総称である。言語の類型によっては、
単語に準ずる形態素や表意性を持つ文字がこの役割を担うこともある。
この連結によって、慣習的に用例と意味が固定しており、字面から意味を推測できないことも多い。 本題の答え *がワイルドカード
あとは書いたように動く
イディオムなんてない >>701
sudoはsudo cmdのcmdの実行をroot権限にするだけ
echo *.confもechoにしてみたらいろんなの渡されてびっくりだよ
shellはあらかじめ余計な処理をする
shellを実行してるのはuser >あらかじめ余計な処理
余計といえば余計だが、その余計なおかげでechoなどは何もしなくてもいいんだけど
POSIXに展開はルールは明文化されてるから一度読めばいいと思う >>703
> >>693
> どれに任せるかって、質問者が想定してんのはフツーにシェルだろ
そんな想定ができるヤツは、あんな質問をしないし、「イディオム」とは言うまい。
想像を絶する想像力のなさでワロタ。w
> あともう分かってるだろうがこのスレ終わってるからわざわざここで質問するな
おまえは、回答するな。 >>704
いや誰もワイルドカードのことはイディオムとは呼んでいなくて、sh -c $command をさも sudo でワイルドカードを使うための構文のように使ってるのがイディオム的だという話なんだが、もしかしてアタマが特別お悪い?
>>706
> 本題の答え
おもろいなぁキミ笑 >>707
sudoであえてshを実行する意味がわかってないやろ? >>710
人格が変わりすぎだろうw
It’s a common idiom to use env to find bash even if it’s been installed in another directory
と同じような感覚で使ったんだろう?そもそもは。とは思ってたけど
しかし人格が変わりすぎwww >>709
なんでなんの関係もないお前が反応してんの
もしかしてID:KZOl1vP3と同一人物でID切り替えながら荒らしてんの? >>712
その文が何なのかは知りませんが、まあそんな感じです
ごく普通の用法ですよね? >>712
別にいいだろうがw
>>703の冒頭の余計なこと書いてるんだし。あんなの書く癖に>>713なんて書いちゃうんだな
やっぱり小心者故の虚勢だったかと思うぞw
>>714
まあ(そんなに)間違ってはないだろうどうな
ごく普通の用法と言われれればどうかなあ??あんま使わない使われてないかな
(そう目にすることはない、Web上のプログラミング的な色々なとこでは。使ってるとこもあるだろうけど) >>715
> そんな想定ができるヤツは、あんな質問をしないし、「イディオム」とは言うまい。
いやこんなにも論理的に破綻していてかつイディオムという語の意味を理解してない奴が同じタイミングで二人もいるって恐怖でしかないんだが >>713
ふつうに考えて、荒らしはおまえの方だな。w
>>717
> いやこんなにも論理的に破綻していてかつイディオムという語の意味を理解してない
ただ主張するのではなく、どのように破綻しているのかを述べよ。 >>719
> ただ主張するのではなく、どのように破綻しているのかを述べよ。
では、
>>709
> そんな想定ができるヤツは、あんな質問をしないし、「イディオム」とは言うまい。
がどう破綻しているか述べる
質問者は「一般ユーザが展開したワイルドカード」と「root が展開したワイルドカード」が違うのを知っているからこそ「sudo でワイルドカードを使いたい」と思い至ったのであって、この時点でワイルドカードの展開はシェルが担うという前提を持っている
その上で「ワイルドカードの展開をroot のシェルに委ねられないか」というのが元の質問なわけだね
従って、
> そんな想定ができるヤツは、あんな質問をしない
というのは偽だ
なんせ事実として質問者は「そんな想定」を持った上で「あんな質問」をしているのだから
また、いくつかの説明や例文がこれまでに出ているように、質問者のイディオムという語の用法は全く間違っていないし広く使われているものと合致するので、
> 「イディオム」とは言うまい
というのも頓珍漢も甚だしい
(もちろん質問者のイディオムという語の使い方が間違っていることをあなたたちが客観的に示すということはあっても良い。できるものならご自由にどうぞ)
そもそも「こういう知識レベルの人間はこういう語を使わない」なる命題が常に真なわけないでしょう
コンピュータの知識と日用語の語彙に何らかの相関があったとして、それは「そういう傾向がある」というだけなのでね
以上のことから、>>709は事実から説明される事柄と尽く反対のことを言っていて、全体的に偽なので、論理的に破綻しているといえる >>692
環境を引き継ぎたければsubshellで
(sudo hoge *) >>699
そのための全ての展開に優先するaliasですよ
user/pwdを保存しておいて、su/sudo&好きにcdしてそこで*を展開
hogeはシェル関数にしておいて、末尾に元のユーザーへsu/pwd復元コード エイリアスはパースの第一段階なので、su root; cd some/dir; hoge *に渡る*はsu/cd後のものになります、言葉不足ごめん
ファイル名展開はパラメータ展開よりも後なので、他の展開で仕込んでもいいかも >>723はalias fuga=に突っ込むコマンドです >>720
> 質問者は「一般ユーザが展開したワイルドカード」と「root が展開したワイルドカード」が違うのを知っている
それは>>692に書かれていない。
おまえの決めつけにすぎないので、以降の長文は全部ムダ。w
まあ、質問者の「イディオムだと思って使う」の意味次第ではあるか。
個人的には、理屈がわかってればそのように「思って」は使わない。 またID切り替えて恥晒し続けるのか
昨日は他スレでも同じようなやつがいたな >>721
権限も引き継ぐから何もやってないのと同じ 微妙に関係しそうだから恥をしのんで
()のサブシェルで手軽にサブシェルのID得る方法ってないかな?
パラメタ展開をエイリアスで遅延テクは、エイリアスが行頭に来る必要があるので、おもむろに書ける()の利点が無くなるかなと >>731
()の中の$$は親シェルのpidを返すのよ
それこそsh -cに(適当にエスケープした)文字列としてecho $$を渡せって話だけど、折角分かりやすい()構文があるのだから、その範囲内で何かワークアラウンドできないなと このようなファイルがあります。
先頭の単語+デリミタ(今回はカンマ)以降の文字を全て削除したい場合は
sedでどのように書けばいいでしょうか?
one,no need word, no need word
two,no need word, no need word
theree,no need word, no need word
four,no need word, no need word sed じゃないけど cut で
$ cut -d, -f2- dat.csv sed -r -i 's/\,.*$/\,/' a.csv あ、あともう一つ突っ込み。
-rもいらないだろ?なんで使った?
バックスラもいらないでしょ >>730,732
サブシェルのPIDはbashの4以降(確か。3にはない)なら、$BASHPIDで得られる
>>732が何言ってるのかわからんけど、他に有用性があるのは sh -c 'echo $PPID' >>739
> >>732が何言ってるのかわからんけど
ああ、本来サブシェルでやりたいこと書きたいことを sh -c 'この中に' 書くってことか
sh は起動するけど、sh -c 'echo $PPID' はそれだけ、$BASHPID と(ほぼ)同等ね、いちおう >>733
grep でいいんじゃね
grep -Eo '^\w+,' hoge.dat >>733
sed -r 's/,.*$/,/g' test.csv
-r 拡張正規表現を使えるようにする。長いオプションはコレー> --regexp-extended
-i 何の確認もなしに実行結果でファイルを上書きするオプション。絶対に使ってはならない。 --in-place
正規表現
「.」は「任意の1文字」
「*」0回以上の繰り返し(たぶん0は空文字列)
「$」は「行末」
「,.*$」でカンマとそれに続く任意の1文字から行末まで
echo "chon, chon, chon" | sed -e 's/chon/5ch/' # 5ch, chon, chon
echo "chon, chon, chon" | sed -e 's/chon/5ch/g' # 5ch, 5ch, 5ch >>733
# cutコマンドで1列目を取り出して
# sedで行末をカンマに置き換える
cut --delimiter=',' --fields='1' test.csv | sed 's/$/,/'
コレでよければ
cut --delimiter=',' --fields='1' test.csv | sed 's/$/,/' | tee test.csv
追記したければ
cut --delimiter=',' --fields='1' test.csv | sed 's/$/,/' | tee --append test.csv pythonとかJavaは沢山ある癖に、シェルスクリプト学べるサイトは一つもないのな… >>733
# PowerShell
Get-Content "test.csv" | ForEach-Object { $1列目, $2列目, $3列目 = $_.Split(",") ; "$1列目" -replace "$", "," }
PS> gal
# Aliasを使うとこうなる
type "test.csv" | % { $1列目, $2列目, $3列目 = $_.Split(",") ; "$1列目" -replace "$", "," } >>747
UNIX & Linux コマンド・シェルスクリプト リファレンス
https://shellscript.sunone.me/
このサイトはどうだ?
リファレンス名乗ってるけど、シェルスクリプトの基本から
解説してるぞ。 書き方間違えた。。
シェルスクリプト学べる講座みたいな意味です。超初心者向けはあるけど、本格的に教えてくれるのないよね? >>750
本格的、ってどういうもの?
シェル芸みたいなものってことか?
ま、それは確かにないだろうなあ。
ほとんどが秘伝というか口伝みたいなものだから、講座作れるほど網羅している
人ってのがなかなかいないしなあw >>752
ま、なにするかによるけど、例えばファイルをリネームしたりコピーしたり、
ディレクトリ捜査/操作したりするようなのなら、pythonとかで書くのは
かなーりめんどくさいよ?w man bash > $HOME/Documents/bash.txt
vi $HOME/Documents/bash.txt
SHELL BUILTIN COMMANDSを検索
man dash > $HOME/Documents/bash.txt
vi $HOME/Documents/bash.txt
Builtinsを検索 man bash-builtins
/検索語句
Nキー:次
Bキー:前
Qキー:終了 >>752
インストールされてない/したくない環境もあるやろ。 本なら、ある。
UNIXシェルスクリプトコマンドブック 第3版、 山下哲典、2015
ファイル・文字列処理なら、Ruby が良い
fileutils モジュールの、DryRun で、実際には実行せずに確認できる。
削除なら、FileUtils::DryRun.rm >>755
何のためのレスかわからんけど、h 押してみ >>758
初心者は、manやinfoの扱いに困ることはありがち。
infoは、ワイも未だに困ることがあるで。💦 bashの予約語
! case coproc do done elif else esac fi for function if in select then until while { } time [[ ]]
その中からdashにはない予約語
! [[ ]] coproc function in select time >>761
(( ))とかもdashにはないだろう。
…つかなんのためにやってんの?これ?w >>747
名著「入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界」 functionはdashにはないので関数定義で
function 関数名 () { }
と書けない。関数をつくるときはfunctionを省く。 Windows10ではC:\Windows\Microsoft.NET\Framework\<バージョン>以下にvbc.exeが標準インストールされてるけど
Windows11のInsider Preview版でも入ってる? シェルスクリプトの引数として文字列を渡すとき、空白等を含むものはダブルクォーテーションで包んで渡してます
このダブルクォーテーションを省略できたら楽なのですが、行末 (セミコロン) まで丸々一つの文字列と見なす方法ありますか 上手く引数をクオートしてやればいいんじゃね、bashには最初からそんなシェル関数が定義されてるので、参考に
declare -p等の出力ね
ただしパースが不可逆な処理である以上、完全な再構築は不可能
自明な例:cmd 'a'とcmd a
行内コメントとヒストリ、スクリプト中のエイリアス展開等を使っていいならもっと攻められる
aliasは全ての展開に優先するので何でもできる
func () { history 1 | 引数処理}
alias getcmdline='func #'
getcmdline ) any' illegal " args
スクリプト中なら
set -o history
shopt -s expand_alias
が必要 pwshにはズバリstop persing operator --%があるね ;で止めるのはexprやパラメータ置換で;以降を切り出しておいて、ラップするコマンドの処理が済んだ後でeval に渡せばいいかな
&等他の制御構造も使いたいとなるとキリがないけど
下手に通常コマンドのように見せかけるのは混乱の元にもなるので、割り切った方がいい たかが''で括る手間を省く為に、あまりアナーキーなことをするのは… インラインコメントのつもりで付けた#以降が読まれる可能性があるけど、普通スクリプト中のエイリアスは無効だから大丈夫なのね w3mブラウザを使っています。
w3mを起動した後の自動処理ってシェルでどのように書けばいいでしょうか??
毎回タブを作ってURL01とURL02を開くなどをやりたいのですが
bashrcにaliasやfunctionを書くことも考えましたが、w3m起動後の処理はできないので困っております。 例えば、Ruby, Selenium Webdriver で、
Chrome なら操作できるけど、そういうマイナーなブラウザには対応していないかも
Rubyの他に、JavaScript でも書ける。
Selenium IDE と言うのもあるらしい
url_0 = "どこかのURL"
url_1 = "どこかのURL"
driver.navigate.to url_0 # url_0 のタブを開く
driver.execute_script( "window.open()" ) # 新しいタブを開く
driver.switch_to.window( driver.window_handles.last ) # 新しいタブへ移動する
driver.navigate.to url_1 # 新しいタブ内で、url_1 を開く TTY操作ってんならシェルスクリプトではなくexpectスクリプトでしょ
Linux/Unix/プログラム各板見たがexpectスレはないみたいで恐縮ではあるが 間に擬似端末を挟む方法で w3m や lynx を自動化したことならあるけど
w3m には自動化のためのインターフェースがあるみたいだよ。
その名を "Local CGI" という。
残念ながら man には書かれていないが、普通にダウンロードすれば
doc-jp/MANUAL.html に書いてある。
サンプルコードは Bonus/ にある。
ご所望のことが全部できるかは判らないが
他の方法よりは確実な動作を期待できそうだ。 レス遅くなってすいません。
>>775
rubyでも書けるんですね。ちょっと詳しく調べてみます。
>>776 777
恥ずかしいですが、expectスクリプトという概念を初めて知りました。
インタラクティブを自動化出来るんですね。
目から鱗で震えました。ありがとうございます!
>>778
"Local CGI"調べてみました。
当方の問題ならこれで簡単に解決できそうです。
色々なコマンド後の処理を自動化したいなとずっと思ってたのですが
皆さんのおかげで解決しました。
ありがとうございます!スレチ失礼しました。 >/dev/nullでゴミ捨ててるコードをよく見るけど、
|:はダメなの?個人的によく使うんだけど
標準入力受け付けない:があったりするのだろうか もちろんステータス見たい時はイエスマンの:はダメだけど、単に出力全部捨てたいケースね
標準エラーはパイプを通らないし、標準出力は:が食べる 全部捨ててるのではなくて
最初に書いた時にSIGPIPEで死んでる
それに無駄にfork/cloneしてる makeについて質問。
makeを多段に実行したとき、ログに「make[...]:」とか段数が出力されますが、あの段数をリセットする方法はありますか?
ログはmake: → make[1]: → make[2]: → make[3]:と深くなるにつれて出力が変わりますが、たとえば3段目でリセットして、make: → make[1]: → make: → make[1]:にする、みたいな。 makeスクリプトの中に
sh -ec make
挟むとか >>785
とくに変化はありませんでした。
別のプロセスを間にはさんでも変わらないようです。 >>784
自己解決。
MAKELEVEL環境変数を設定。 スクレイピングしたいんですけど何を勉強すればいいですか
不正アクセスに問われたりしないでしょうか?
セキュリティ対策はどのようなことに注意すればよいでしょうか? 他人は誰も何も保証などしないし責任など取ってくれないので法律について自分で調べて安全圏と思える範囲内でやるしかない なんでわざわざシェルスクリプトでスクレイピングするのか? wgetやcurlとjson
HTMLを加工しデータを抽出するためにsed、grep
不正アクセスのリスクはどこにでもある
相手次第でしかないから
過去に図書館のシステムを作ったエンジニアが
蔵書を調べたいという目的で負荷をかけない範囲でアクセスしてたら
訴えられたってのあったな
自分がやってたのを例に挙げると
配信サイトからの動画の一括ダウンロード
配信履歴の取得などか
動画はまあそのものだが
HTMLの履歴ページにアクセスしてページを繰って
回数、時間などの集計をして傾向を分析してた
id入れれば全部やってくれるから便利だったけど
一連の処理をするツールは自分で作った >>792
不正アクセスの意味すら知らんやつがスクレイピングしたらだめだぞ >>792
あれは常識的に考えて安全なスクレイピングクライアントでも
サーバー側のミス(接続ごとにcloseしてない)が原因で
負荷かけてないつもりが負荷かかったーって理由で逮捕だから理不尽すぎるわ googleが関わっているサイトはそもそもスクレイピングをさせないよね
自動的にやっていることが分かった瞬間にアクセスを出来なくしている
アルゴリズムは非公開
時間間隔を見ているとかそういう単純なものではないらしい youtubeとか普通に出来てるんだが
特に規制くらったりは無いな google検索を自動にしようとすると規制を受けるよ zshで走るスクリプトをもらったんですが、bashで走らせるとどこかでエラーになるようです。
一応bashで走るようにしたいんですが、スクリプトのどういう部分をチェックしたらいい、みたいの
ってあります? ググればある
問題点を絞り込めないんだったら、Webで長く書いてくれてるのを読もう 1行ずつ貼り付けて実行してエラー箇所確認できないの いやーここの皆さんならエスパーしていただけるかと思ったのですが。
とりあえず line 25: zparseopts: command not found と出ました。 zsh固有のを使ってるつもりが無くてもbashで動かないのは、
いくつかある動作の僅かな差異でもありえるし、そのどれを使ってもわからんから、
エスパーは無理だろな
command not found やん。モロzsh固有の使っててやん
zsh固有のなんてもっとあるんだから、エスパーは尚更無理だろうな
getopt/getoptsを書き換えればいいだろう、その部分の話なら
他にもあるんだったら、command not foundもわからないんだったら自力では山が高いとしか思えんけど、自力で頑張れ つーか、何が起きるかわからんのに、別シェルのスクリプトをわからんままによく実行できるな。w
メチャクチャに壊されるかもなのに。 zshって真面目にドキュメント読もうとすると
機能多すぎて嫌になるよねw あ、janeからも書き込めたw
禁止解除されたかwww っていうか普通にzshインストールすりゃいいだけじゃん そのシェルスクリプトの最初に
if [ $BASH_VERSION ]; then
sudo apt-get update && sudo apt-get install -y zsh
zsh "$0" "$@"
fi
とか書いておけば動くんじゃね?www >>808
>もらった
んだから普通は知り合いからだろうし、何をするのかもわかってるだろう
知り合いで当たり前のように悪さするような>>803のようなのwはまあ普通はいないわな
あんまよくわかってなさそうで、何をするかはわかってるが途中で失敗した時の弊害とかはわからんかも知れんけど zshで動くものをbashで動かしたら何が起きるかわからんじゃん
そのzshスクリプトはエラーでちゃんと停止するんか?
想定とは違うディレクトリで中途半端に動いたりしないんか? >何をするのかもわかってるだろう
のうちだろ
動作させないと何が問題かわからんし、そもそもどの程度の知識かもわからんし
仮に何かあっても、全く何もわからないのにbashで動くようにしたいという望みを持った勉強代だなw
動作させないと何が問題かわからんのだから、問いに対して動かしてみろと言うのは当たり前の話でしかないだろう
何を言いたいのかわからんぞ どうなるか分からんけどとりあえず動かしたいならdockerコンテナ上で試せばいい >>810
結局、わからんのやないか!
アホなの?w
コマンドや変数展開の違いとかでちょうどヤバい状況になる可能性もあるのに。 >>814
仮に何かあっても、全く何もわからないのにbashで動くようにしたいという望みを持った勉強代だなw
>>810にそもそもその言うのも含んでるし
そして実際にはとりあえず何も無かったようなのに、想像だけ読まないで文句言ってもしょうがないよ >>815
知らんがな。
そもそも、>>803に悪意を想像すんな! >>816
何が知らんがなだよw
「メチャクチャ」に「壊される」からは悪意を想像しても不思議ではないと思うけどなあ
そんななんかダメなとこあったらメチャクチャに壊すスクリプトもそう無いだろうからな。そんなのばっか書いてるの? >>817
超ふしぎじゃ。
壊す主体は、動作の読めないスクリプトに決まってるやろ。
読解力ゼロなんか。w
> そんななんかダメなとこあったらメチャクチャに壊すスクリプトもそう無いだろうからな。そんなのばっか書いてるの?
たまたまrm *になるだけでおしまいやぞ? >>818
何を言っているんだかな
何が「主体」だか、当たり前だろ。その主体に悪意があるかもしれないって話だろう
「メチャクチャ」に「壊される」が悪意を持って書かれたスクリプトを表すと読めても不思議ではないって話なんだが
読めないのはどっちなんだかなw
たまたまとか頻度がわからんな。すぐにそんなの想像してしまうぐらいの頻度で書いてるのか?w
とか、もうアレだけどw とりあえず単なる杞憂でしかないのは質問者の最初のレスで明らかだし、自己責任の範囲。やってくれないとレスしようがないし、
やってちょっとはその具体的な実行結果を出してくれたことにより、原因他が明確(*)になってんだから、ただの蛇足もこれまでにしとこな
*)お前の最初のレスもそれにより=ほとんど何も知らない人だったとわかってだろう?w ども、801です、盛り上がらせてしまいすみません。
どちらかというと興味として、素朴に、zshもbashもshベースで割と簡単に移植できるのかな? と
思ったんですが、結局それはNOってことですかね?
ちなみにzparseoptsというのはあからさまにzshの関数ぽいですが、
他に、どうやら変数(の中身)の展開に違いがある? ような感じでスクリプト中で呼ばれるコマンド
の引数に正しい値が渡らなかったりしてるようです。 ・POSIX(sh)のだけ使ってる
・bashにもzshにもあるのを使ってる
は、問題があったら調整ちょっと手直し程度
・zshにしかないのを使ってる
は、当然、該当部分の書き換えが必要
少しは知っているのならYESだが、
ちょっと何も知らないようなので自分で勉強する気やる気があるのかによる。今はNOだろな >>819
んな話はしていない。
無生物に悪意を妄想すな! shベースはPOSIX shベースって言えばいいと思うけど
bashとzshに共通のものってなんて言えばいいんだろうね >>822
わざとなのかなんなのか
悪意を持って書かれたスクリプト
な、いちおう
一行目からはわざとではないみたいだが、だったら、読解力ゼロなんかを自分で嚙みしめようなw >>823,824
bash/zshフレンドリー?w
共通仕様の公式なドキュメントがあるわけでもなく、書いた人の知見頼りだろから、そう何か明確な名称的なのはなさげかなあ
kshからのが多そうね。bashが最初でzshでも採用ってなかったかなあ >>825
んな話はしていない。
おまえが妄想を混ぜただけ。
読解力ゼロ。w >>827
マジでなのか
しつこいなw繰り返すだけのを、内容無いのを、よくできるなあ
何が面白い(自分にとってな)と思ってやってるの?会話としてでもなさげで >>829
会話にならん、なってないぞwイミフすぎ
何が面白い(自分にとってな)と思ってやってるのかだけしかもう興味がなかったけど、それを知るのも無理そうだなw
まあ終わりだな setコマンドで位置パラメータを指定するときに、
引用符でかこわれていない変数がフィールド分割されるかどうかって決まってたっけ?
setの仕様にはそれらしき記述はなし。
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_25
BashやYashでは分割されて,Dashでは分割されない。
$ bash -c '
set -- "a b c" "d e f"
set -- $1 "$@"
echo $1
'
→a
$ yash -c '
set -- "a b c" "d e f"
set -- $1 "$@"
echo $1
'
→a
$ dash -c '
set -- "a b c" "d e f"
set -- $1 "$@"
echo $1
'
→a b c >>831
しゃあない。
おまえは読解力ゼロやからな。w >>832
setとか関係ないだろ
どのコマンドでも一緒だ >>834 ???
bash -c '
a="1 2 3"
printf "/%s/" $a
'
dash -c '
a="1 2 3"
printf "/%s/" $a
' >>835
あのさぁ、なんで実行結果を書かないの?
やってみればすぐわかるだろ
$ bash -c '
> a="1 2 3"
> printf "/%s/" $a
> '
/1//2//3/
dash -c '
> a="1 2 3"
> printf "/%s/" $a
> '
/1//2//3/
まーーーーーーーーーったく同じ >>836
いやさ,それの実行結果が一緒なのに,
$ bash -c '
set -- "a b c" "d e f"
set -- $1 "$@"
echo $1
'
→a
$ dash -c '
set -- "a b c" "d e f"
set -- $1 "$@"
echo $1
'
→a b c
こうなるのはおかしいだろってことだよ。
話わかってるか? 消えな。いちいちデマ流すな。
dash -c '
set -- "a b c" "d e f"
set -- $1 "$@"
echo $1
'
a dashで>>832見たとき試した時は、
a b c
になったけど、しばらくしたらなぜかw、
a
になるようになった、にしかならないようになった
とりあえず、現在は a b c は気のせい/何かの間違いだなと思ってるw
(多分なんかの環境値かなあ??)
メイン環境ではこんなんだったけど、ほぼあんま使わないクリーンに近いUbuntu(VM)でも a だからな
zshはデフォでは、
a b c
emulate posix でも a b c、emulate bash で a
posix でも a になるべきなんだろうな
単に shwordsplit on にするだけだけど emulate posix 時オプションセットのバグかなあ ミスといえば >>832 → >>834 の流れを読まずに
>>835 だけを見て意味不明な返信 (>>836) をしてたミス≠ヘどうするんだろうな。 お前もある意味勘違い(他の環境でなり試せばわかること)で騒いでいたんだから、
何をなんかその嫌らしいことすんなよ >>839
>emulate posix でも a b c、emulate bash で a
>posix でも a になるべきなんだろうな
>単に shwordsplit on にするだけだけど emulate posix 時オプションセットのバグかなあ
posix shell を emulate する場合は posix ではなく sh か
じゃあ、psoix はなんなんねん、イマイチわからない。もしかしてそんなの無いとかか??w
emulate sh にしたら、
shwordsplit on
になるかと思いきや、
noshwordsplit off
って、shwordsplitに変わってnoshwordsplitに(同じだが)。そんなにoffに拘りたいのか
なかなかクセが強い感じw
ほぼzshネタ。でも、zshでposix shell互換にするにはというお話でした zshでemulate bachfileってやったら
バッチファイルモードになったYO! なる。 zsh|sh|ksh|csh だけか
以外ではエラーにならずに zsh が指定されたとみなすか
起動時とのでオプション変わるから別のオプションセットがセットされてんのかと思った emulate cshってどこまでcshと互換性あるの?
cshのシェルスクリプトがzshで動くわけ? >以外ではエラーにならずに zsh が指定されたとみなすか
いや、bash が指定されたら sh とみなすってのはあるみたいだな。例外か?
bash対応のチラっとあるからbash互換のオプションセットがあるのかと期待してた/思い込んでたんだけど、単に(例外的に) posix shell 互換にするだけなのね emulate "b型の血液が足りないんです!どなたか!どなたかいませんか?"
だったらshになるな。うん。 >>848
シェルオプションが変わるだけかなあ
一応、元々 ksh+tcsh で開発されてるし、cshの命令文も動いたりもするが、なんか全部ってわけじゃないなて結論で俺は確認はやめてた、以前
cshのオプションセットになったら、もっとちゃんと動くのかもしれないし大したことがないかもしれない、どうなんだろねw >>850
へー
てか、お前詳しくzsh知ってるだろ? cshの命令というかコマンド?は、互換関数でも作れば対応できるんじゃねと思ってるんであんまり気にしないんだが
cshの文法ってzshに組み込めるようなものなのかなって気になってる
cshよく知らんけど、文法自体が少ないのか?関数もなかったはずだよね >>852
いやしらんてw
昔の人の実装者の気持ちになって考えたら
「お?これだけのパターンなら最初の一文字だけ比較すればいいんじゃね?俺天才じゃねwww」って
考えそうだなって思っただけ
なんつーか、手抜きだよなー。
あー、というかこれbash対応じゃなくて
bourne対応じゃね?bourne=shだし >>853
素では、cshの(一部)命令も書ける=B shellとチャンポンできるて感じ
ベースは B shell だがそれに csh の命令文も B shell の命令文と同じように書けるって感じ。関数も普通に使える
emulate csh でそゆのがどう変化する/壊れるのかは試してもないのでわからん、どうなんだろねw
>>854,855
なるほど、それは失礼
zshが起動された時の 起動名 (shだったらsh互換でとかの) が確かそんな感じで判断しますのようなのがあったな、そういえばってので
それと同じかもっと手抜きなのかもね ボーンシェル
コーンシェル
ゾーンシェル
ぞーーーーーん! トリビア
1985年に日本で生まれたシェルがある
そのシェルは 2020年まで存在していた
その名も シェルじゃなくてシエル?
あ、これは1991年だった。 キヤノン
キユーピー
シヤチハタ
富士フイルム
エドウイン 新しいシェルを作りたいのですが
どのアルファベットが空いてますか? bshとbashがあるくらいなんやから、一切気にしなきゃええんちゃう?w
勝てば官軍!
勝てばね!
ふつうは、戦える立場になれないけど! Rustのメモリ安全性はボローチェッカーによって担保されているが、
Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と
C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています
Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、
GC無しのView typesで参照の有効性を検証することによってメモリ安全性を保証しつつ
限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます
Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ
なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか?
Nimの実験的特徴
著者: アンドレアス・ルンプ
バージョン: 1.5.1
http://nim-lang.github.io/Nim/manual_experimental.html
Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し
ているにもかかわらず、高速なCのソースコードを吐き出せるのでC言語でリモートワーク
されている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる
「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます Rustのメモリ安全性はボローチェッカーによって担保されているが、
Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と
C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています
Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、
GC無しのView typesで参照の有効性を検証することによってメモリ安全性を保証しつつ
限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます
Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ
なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか?
Nimの実験的特徴 バージョン1.5.1
http://nim-lang.github.io/Nim/manual_experimental.html
第二プログラミング言語として Rust はオススメしません Nim をやるのです
https://wolfbash.hateblo.jp/entry/2017/07/30/193412
Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し
ているにもかかわらず、高速なCのソースコードを吐き出せるのでC言語でリモートワーク
されている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる
「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます awkでデータの中にスペースを入れるにはどうしたらいいんでしょうか? "a b" "c d"
みたいなデータを読み取れませんか? "a b" と "c d" に分割したいのであれば GNU awk の FPAT を使って
gawk -vFPAT='"[^"]*"' '{ ... }'
なんてできるけど、ダブルクォートで囲まれた内部でダブルクォートが
使われる場合には。。。 Ruby では、CSV 列内の""(クォート文字)は、\" に、
列内の改行コード・カンマ(行区切り・列区切り文字)も、適切に処理される
列内に、CSVの特殊文字、行区切り・列区切り・クォート文字が無ければ、列はクォート文字で囲まれない。
もちろん無条件に、すべての列を囲んでもよい
require 'csv'
input = <<"EOT"
"a""a","b,b",あ
"c
c","d\nd"
EOT
p input_ary = CSV.parse( input ) # 2次元配列
#=> [ ["a\"a", "b,b", "あ"], ["c\nc", "d\nd"] ]
# 2次元配列を、CSV 文字列に変換する
csv_str = input_ary.map( &:to_csv ).join
puts csv_str
出力。元に戻る
"a""a","b,b",あ
"c
c","d
d" 頭のおかしい人に以下のようなことを言われました
>>基本、スクレイピングは営業妨害との戦い。
>>どの本にも、そう書いてある。
>>スクレイピングを推奨する本はない
具体的な書籍名を教えてください
>>5ch は、マルチポスト禁止!
>>同じ質問を、複数のスレや外部のサイトに書いてはいけない
どこでそんなルールが決まっているのでしょうか? スクレイピングはサイト運営からすればボットと同じ迷惑行為。警告を無視して続ければ営業妨害に認定される可能性もある。
マルチポストはいわゆるネットマナーに反する行為。質問者がマルチポストを繰り返せばその質問者が「頭のおかしい人」と看做されるだろう。 技術的に無能だが一般常識にも無能なのはたまに居るな あと Ruby の基地外な
rubikitch のことじゃないよ ニュースグループならクロスポストってのが出来たんだけどな >>876
a_b_c_dをa_bとc_dにしたいの?
アンスコ→半角スペース bash sample1.sh && sample2.sh
でsample.shがexitとかfalse的な感じだったらsample2.shは実行しない
という処理をするにはどうしたらいいのでしょうか・・? 補足です >>889
そもそもやりたいことはsample2.shの冒頭に
if 条件; then
echo "o"
fi
みたいな条件式が出てくるのですが
その条件は他のsample3.shでもsample4.shでも重複して出てくるので
分けたいなと思いました
そういう書き方があるのかな、と とりあえず自己解決?しました
外部読み込みで関数引き出すことにしました
しかしなぜか
if 関数1; then
echo "o"
else
echo "x"
fi
関数1の返り値が0のとき"o"、1のとき"x"となり
思ってたのと逆になりました
関数1 () {
return 0
} プロセスの終了ステータスと同じ思想
0を返すなら正常
0以外を返すなら異常 >>892
なるほど
python行ったり来たりするのでなんか頭こんがりそうです; >>891
逆ではない。それで良いのだ。
成功したら0を返すというUNIX等での昔からの慣習に従っているだけ。
if は動かしたコマンドや関数の終了ステータスが0なら成功したと認識して then の後を実行しようとするように作られている。 ってリロード忘れて書いたら既に答えが書かれて話が終わっていたorz >>893
PythonならTrue/Falseやろ。
ムダに混乱すな。w シェルスクリプト内で return true とか書ければいいんだが。
引数なしの return はその直前のコマンドの戻り値を戻すので
true ; return
とか
return $(true)
って感じか? true=0 ; false=1 って定義しておいて return $true もあるか >>893
grepコマンドのexit statusを調べるんだ
それでもう忘れなくなる >>897
やめろ。w
逆に混乱のもとや。
どうしてもっつーなら、EXIT_SUCCESS/EXIT_FAILUREか?
プロセスの戻り値についてちゃんと把握したら、混乱なんかなくなるで。
実質8ビットとか、シグナル結果も混ざるとか。
>>899もそういうひとつ。 >>900
(実装上は?ではあるが)C言語で言う \0 や NULL は必ずしもゼロではないから
ハードコーティングするな、みたいな話と同じでは?
C言語で EXIT_SUCCESS がマクロ定義されているのと同じでは?
あとシェルスクリプトで EXIT_SUCCESS って定義されてる? >>899
cmp, diffなんかも同じ
これは本来のタスクの成否に加えてエラー状態でliftしてるわけで
option typeと同じ >>901
そんな机上の空論は、シェルに不要。
ハードコードとはもう言わん領域。
おまえは#define ZERO 0とかすんのか?w >>904
イカれたエンコーディングが対象で、暗黙変換がしっかりされるなら、かならずしも0でなくてもええかもな?
イバラの道というか針山というか、愚かな夢想やけど。w >>905
おいおい話ずれてないか?
C言語は if 文に数字を渡したらノンゼロで成立、シェルスクリプトはゼロで成立って話なんだが
つまり、C言語は #define TRUE 1 でシェルスクリプトは TRUE=0 ってこと
>>904
定義されていないからゼロとは限らないって話らしいよ >>907
おまえが勝手に勘違いして決めつけとるだけや。w
0は「TRUE」をあらわすのではない。
ただの「0」や。
シェルとかでは一般的に、0を成功と見なすことにしとるだけ。
プログラムによってはあえて、1なら成功半分失敗半分、2なら超失敗、みたいにしてもええ。 >>907
\0が定義されてないの?
nullはnullであって0じゃないけど
\0は0でしょう? >>909
Cでは、文字コードが定義されてない。
エスケープシーケンスは定義されとるが、その数値としての値が定義されてるかどうかは別の話や。
Cにはスタンドアロン環境があるし、>>906みたいに対応できなくはないやろうし、(char)¥0は(int)0でなければならないはずやが、それでもメモリ上では0でない可能性はあっていい気がするわ。
堅実にはありえないような、愚かな夢想やがな。w Makefileのコマンド部分のインデントにタブ以外つかえないの地味にツライです >>908
俺が勘違いしているとお前がいうならそれでいいよ
じゃあ新しい話
return 0 が C言語とシェルスクリプトで意味が真逆で紛らわしいんだがどうする? >return 0 が C言語とシェルスクリプトで意味が真逆
え? main()のreturnに関してはshと一緒だが
returnに限らずifや論理演算で使うときの0/0以外は意味が真逆って話ですかね
どうするもこうするも、脳内で切り替えるしかないのでは 動的に変数名を作ってそのまま使用するのってどうやるのでしょうか
val_a="aaa"
val_b="bbb"
ary=( "a" "b" )
for s in ${ary[@]}; do
echo ${val_$s}
done
だとbad substitutionでした >>916
成功(0)失敗(0以外、だいたい負数もしくは-1) と 真(0以外もしくは1)偽(0) があるが、真偽しか知らないとかかな
C には main 以外にも 成功失敗 を返す関数はいっぱいある。もちろん成功失敗/真偽以外のを返すのもは言わずもがなだが。Cという言語でさえ何の関数でで切り替えなきゃ C 使えないだろうにな
シェルスクリプトは成功失敗でしかないからなwhileやifなどの基本的な制御文は val="val_$s"
echo "${!val}" >>919
> シェルスクリプトは成功失敗でしかないからなwhileやifなどの基本的な制御文は
いや、それはCも同じや。w
条件部に任意の式を書けるだけ。
そいつは、物事をムリヤリにでも単純化したいだけやと思う。
まあ、気持ちはわからんでもない。
ワイにもそういうときはあった。
初心者かつ理想主義者ならではなんかね。 >>922
C は 成功失敗 とかではなく、評価式の結果の値が 0かそれ以外か だけど
原典のK&Rに書いてある通り
真偽 Booleanと言えるが そもそもはBooleanが無いから 0かそれ以外か だな
シェルスクリプトはモロに成功失敗でしかないから、true「コマンド」のexit statusが 0=成功 でそれで成り立ってるんだけど >>923
シェルスクリプトの判定は、プロセスの終了ステータスの値が0かそれ以外かなだけ。
それが成功か失敗かはただの解釈の話。
Cと同じ。
testコマンドとか知らんのか? >>924
Cも知らないのに何言ってるんだかなとしか思えん
シェルスクリプトが扱うコマンドはCで書かれてもいての EXIT_SUCCESS ってあるんだけど。もちろんシェルスクリプトはその値をもベースにしてる
判定は真逆だろうに、Cと同じって何を言っているのだか
C
if( 評価式 )
判定式の結果値が 「0でなかったら」
シェルスクリプト
if コマンド; then
コマンドの EXIT STATUS が 「0だったら」
testコマンドも同じ、評価した結果が 成功か失敗 でしかない。EXIT STATUSはそういうもんだから...なんてCでなんか書いたことあるなら当然知っているだろう >>920
¥マークをバックスラッシュにしたらできました
>>921
一度格納するのですね できました
どちらもできました
ありがとうございました。 [ ] がコマンドだって知らない人がいるのかな?
シェルスクリプトの真偽はCと同じですよ
コマンドの終了ステータスはCもシェルスクリプトも0が正常、0以外が異常
echo $((2 > 1))
1
↑の通りシェルスクリプトの真は1 >>927
真(0以外もしくは1)偽(0) だけだと思うから、変なこと言い出しただけだろう
成功(0)失敗(0以外、だいたい負数もしくは-1) もあり、シェルスクリプトは 成功失敗 でしかないって話だよ
「真偽はCと同じ」とか言い出すから...w 2分岐でしかないとこのを真偽と言いたいのかな?
シェルスクリプトの制御文はEXIT STATUSしか見ないから、そんな例は無意味だろう
普通 if 文は 真/正 だったら〜でif分内に入るが、その例を持ち出してどう説明するの? >>925
EXIT_SUCCESSとかはただの超後付けやぞ?w
もともとそんなもんはなかった。
条件判定は、判定が逆なだけで、やってることが同じ。
成功か失敗かではなく、値しか参照してない。
読解力がないヤツはめんどいな。。。
ま、いいけど。では、これにて。 >>930
後付けでも 0 は正常終了って決まってることだろに
後付けでわかりやすく定義しただけだろう。EXIT_SUCCESSが定義されてから 0 が正常終了になったとでもいいたいの?
反論のために言い出したのが「後付け」って、何もわかってないなとしか思えんぞ
「判定が逆なだけ」って...なんで逆かを言ってるんだが、自称読解力あるはずなのに、まだ読めないのな
>>927の最初に言ってるのに、無視して(理解できないからか?)変なとこ食いつくだけだあるなとしか思えない 成功(0)失敗(0以外、だいたい負数もしくは-1)
というのは太古から存在してるというのを、元々のやつはおろかそいつに反発(?)してるやつもどうやら知らないらしい...
何で知らないのか理解できない、Cに限らず他の言語でもあるのに >>929
何がいいたいのかさっぱり
if [ $bool = 1 ]; then
で真だったらって書けるやろ
分かりづらいって言うなら
TRUE=1
if [ $bool = $TRUE ]; then
でもいいし >>934
>[ ] がコマンドだって知らない人がいるのかな?
と言い出したのに...本当に自分ではわかってるのか疑わしいぞ
if文=シェルスクリプトが判断してるのは その評価式=ではなく評価式を評価したtestコマンドの EXIT STATUS = 成功失敗 でしかないって
本当にわからない人だなあ
Booleanなのに true とか 1 と比較するのはどうなの、というのは個人の好みだが、こうも書ける。関係ないけど
bool=true or fasle
if $bool; then
...
よりシェルスクリプト基本に添ってると思うけどなw そのある意味オレオレよりは >シェルスクリプトが判断してるのは
シェル(シェルスクリプトインタープリター)が判断してるのかか
なんかあったw K&R 初版にすでに
The program also uses the standard library function exit, which ter-minates program execution when it is called. The argument of exit is available to whatever process called this one, so the success or failure of the program can be tested by another program that uses this one as a sub, process.
By convention, a return value of 0 signals that all is well, and vari-ous non-zero values signal abnormal situations.
って書いてある
Cが何のために作られたか、シェルスクリプトも何のために作られたか、それぐらいわかってはいるだろうから、この短文だけで「読める」だろう(自分勝手な理解を置いておけば)と思いたい >>935
だからシェルスクリプトでいう真(1)かどうか?を
コマンドで判定してるんだろ > Booleanなのに true とか 1 と比較するのはどうなの、というのは個人の好みだが、
シェルスクリプトが真で1を返してるんだからしょうがない
echo $((2 > 1))
1
FALSE=0で0以外だったら?と書いてもいいけどな >>937,938
話にならんな
だからコマンドの(評価式の)判断はシェルスクリプトのifなどの制御文と関係ないって言ってるだろうに
>シェルスクリプトが真で1を返してる
今だに、全然わかってないのが明らかだな
>[ ] がコマンドだって知らない人がいるのかな?
って、自分で言ってるのに、本当はわかってないんだな
わかってないのにこう言った意味意図がわからん わかってないわかってない言うだけで
何も指摘してないなこいつw 指摘してるのが読めないのな
いや読まない認めないだけか いや、手取り足取り教えてくださいかな
この意固地っぷりわからなさぶりは
元々のヤツよりよほどわかってなさげだなあ、何でそいつらの方がめんどくさいんだか だからシェルスクリプトの真は1
if や真偽値ではなくて、終了ステータスを見る
[]はコマンド、その戻り値は終了ステータス
って言ってるだけですが? まだ「言い張ってる」
やれやれ
単に「人に対してわかりやすい」単なる「算術結果」の「プリント」でしかないのに
結果が A/B でも構わない=制御文と「何も関係ないから」。そうでないのは単なる人に対しての場合の慣例だからだろうとわかりそうなものだが
そんなにBooleanが好きならやっぱりせっかくそのもである true/false 使えよと思わなくもない、制御文にもそのまま使えるのだし 真偽値は1(0以外)と0だっているのに、trueとfalseだって勘違いしてんのかw はあ...
>真偽値は1(0以外)と0だっているのに
慣例およびCとかBooleanが明確にないとこはな、そんなの常識だろうに
真偽 Boolean値はある意味正式には true/false だぞ(YES/NOとかのとこもあるけどな)、それすらも知らないとか... 無知も大概にしろ、それもそんなくせに何か自分は知ってる風とか
ただただめんどくさいだけじゃん
てことで > 真偽 Boolean値はある意味正式には true/false だぞ(YES/NOとかのとこもあるけどな)、それすらも知らないとか...
書いてある所持ってきてw
いっつも、何の根拠もなく
主張だけしてるよなお前
だから証拠付きつけられて負けてるんやで モロ「手取り足取り教えてください」を自白w
少し調べればあるぞ、コンピュータサイエンスの常識だからな
本当に無知のくせにただただめんどくさいヤツだったとは
まあ、あとは自力で頑張れ。その使ってるナニかは自分で調べるためにもあるんだからな 終了ステータスは
(エラーが) [ 0:false:有りませんでした | 0以外:true:有りました ]
だと思ってたんだが 終了ステータスは、真偽値じゃなくて数値だからね
127 はコマンドが見つからないとか、いろんな意味がある >>953
これ、アプリが127を返すようだと区別できないな。
ビットはあまりがちなんだから、ちゃんと整理しといてほしかった。 と思ったらcのが早いのか…
当時ナウかったalgolの影響大きすぎて錯覚する(fiとかesacとか) algolは死んだしcを新参と笑えるバリバリ現役言語はlisp、fortran、cobolくらいでは >>963
3型文法の形式言語です
Turing完全ではないので一般的にはプログラミング言語とは言いません >>963
「expression」の和訳の問題だから。 俺もUNIXプログラミング環境持ってるけど、真と偽をtrueとそれ以外(false)って感じで書いてある。シェルスクリプトで真偽と言うとこれだよな。一般的な真偽値とはまた別で。
それにifは真かそれ以外かしか見れないんだから真偽値で言う偽なんざいらねーし。 >>969
Unixプログラミング環境、今となっては結構レアな本だと思ってたけどみんな持ってるのか。
特に邦訳版から読んでそれ以降使い込まなかった人はシェルスクリプトの真偽はゼロかそれ以外って覚えてても不思議はないと思うな。 不思議もなにも、それしかないからな。
勝手に意味付けしようと思い込むヤツが勝手にややこしくできあがってるだけで。 真偽じゃなくて成否なんだよ
Exit statusは
否は複数あっていい
&&や||はexit statusに関連する成否を扱う演算なんだ
どこにどう書いてあろうが、本質はそれ以外にない
「関連する」と書いたのは
$ not-exist-command || echo hello world
not-exist-command: command not found
hello world
$ not-exist-command && echo hello world
not-exist-command: command not found
$
これはexit statusじゃないから >>972
うーん、失敗したら真を返すプログラムも書きたいから、スクリプト側では成否と言う概念や言葉を使うより真偽の方がやりやすいんじゃないの? >>972
いや、それもexit status。
man bash(COMMAND EXECUTION)にもはっきりそう書いてある。
プログラムとパイプライン各段、終了ステータスを出すほうと受けるほうで混乱すんなよ。 >>973
真偽も成否も忘れろ。
0か0以外かの判定でしかない。 >>976
Wikipediaで言うと
https://ja.m.wikipedia.org/wiki/終了ステータス
の意味論最終段
時には、終了ステータスをうまく設計し、呼び出した側のプログラムがそれをそのまま条件分岐のインデックスとして使うということも可能である。
の所かな。
結局、
>>975 ですよね。 >>976
C API的には
EXIT_SUCCESS
EXIT_FAILURE
を使う
前者は0であることが規格で決まってる
後者は0以外だが特に決まってない
特定の値、例えば1に依存したいならこのマクロは使ってはいけない >>978
「C API」とか言うヤツがどこまでわかってんだか。w C/C++の関数は成功で1を返すのが多いと思う
strcmpみたいなのは例外
WindowsのAPIとかunixのシステムコールも基本的には同上だと思う
ところがシェルのコマンドとして観た場合 !0 は失敗で成功が 0
初心者はここで混乱する >>982
失敗の理由を返したくなったから
0以外で複数の値を取れるようにした
と覚えましょう >>982
またええかげんなことを。。。
strcmpの戻り値は、成功か失敗かではなく、大小関係だから。
C標準関数、UNIXシステムコールの多くは、失敗時に-1、成功時は0や非負整数を返す。
ちなみにエラーの内容はグローバル変数errno。
初心者は、歴史的事情とか現実の適当さとかを知らない。
だから、まったくの別物にも、なにか統一的なルールがあるはず、と勝手に夢想して勝手に混乱してまう。
そんなヤツもじきにわかる。
ルールがあるとしたらただひとつ、ルールなんか存在しないのだということ。
つーか、ええから黙って覚えろ! >>984
呆れるよな
全く真面目に勉強しようとせずに、勝手に理解したつもりとか だからC言語で真偽値を返したいって言ってるんだろ! >>986
じゃあシェルスクリプトのスレに来んなよ!w >>982
まあ、これなんだよね(笑)
要はシェルスクリプトだけは成功やノーエラーは0でないとだめよん、と覚えておきゃいいだけよ。
他は他でそれぞれの流儀があるならそれに従いなさい、ってだけのこと。
まあ、どうしてもってんなら、シェルスクリプトで成功で1を返したっていいけど、あとあと面倒くさいことになるよ、ってだけ。 つか、問題が少しずれてるんだな。
シェルスクリプトで、0がノーエラーでなければいけない理由はif文の条件式の判定が
特殊だから。
シェルスクリプトでは、
if C then; A else B fi
となってる場合、Cが0のときが真という扱いになっているから。
普通のプログラミング言語では、ここはCが0のときは偽、それ以外は真。
ここがシェルスクリプトの独特な点。
だから、成功は0を返しなさいよ、ってことになるわだ。 >>990
そもそも、シェルスクリプトのifの後に書けるのは条件式ではない。
条件式だとか思うから、ほかと違うんだ、特殊なんだと考えてしまったりして混乱する。
あくまでコマンドラインなんだから、ほかのプログラム言語を引き合いに出そうとした時点でもうおかしい。 >>991
あくまでもコマンドライン、って考え方がもうおかしい(笑)
コマンドラインってのはあくまでも多少制限されているだけのスクリプトを書く場所、だよw
あと、ifの後に書くのは条件「式」だよ。そういう屁理屈こねたいなら、値ってのは式のうち、てくらいの常識はわきまえておいてねw >>992
アホか。「式」とかイキってんな。w
まずシェルのmanページを通読してこいよ?な? >>93
アホか。「コマンドライン」とかイキってんな。w
ワンライナーはシェルスクリプトじゃない、とか強弁するつもりなのか、お前は?www >>993
あとさ「プログラミング言語」ってものを
もう少し勉強しなさいね。
「式」くらいの用語で「イキっ」ちゃうようじゃ、こうい
話題に嘴はさむ資格がないよ。w シェルスクリプトのifの後に書けるのは条件式ではない、コマンド
コマンドライン云々はif文のそこにではなく、シェルスクリプトがなんのためにってことだろう
まあ未だに他の言語と同じと言い張り、いろいろ理解力が足りないのにイキってるw奴には読めない理解できないんだろな >>996
コマンド呼び出しになるのは「式の値」が問題だからだよ。
ほんと面倒くさいな。true、falseコマンドも知らねーの?w
あくまもコマンドラインだから、シェルスクリプトはプログラムじゃない、プログラム言語じゃないと
強弁するつもりなの?w
あのさあ、俺が誰かなのかを下衆って勘繰る暇があるなら、コンピュータと日本語を
ちゃんと勉強しような?w >>989
シェルスクリプトだけじゃなくてC言語も成功は0を返さないとだめだって言ってんだろ
頭大丈夫か? はい、おしまい
真偽値と終了ステータスの区別もつかないのはアホ このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 229日 8時間 32分 7秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。