シェルスクリプト総合 その30

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2019/07/01(月) 23:04:27.02ID:/rKj5XUf
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。

前スレ:
シェルスクリプト総合 その29
https://mevius.5ch.net/test/read.cgi/tech/1537540487/

0952デフォルトの名無しさん2019/08/10(土) 23:47:33.55ID:L+B8OP2P
のがしたorz (笑)

0953デフォルトの名無しさん2019/08/10(土) 23:48:57.21ID:AU+T1mdi
>>949でよろしくねw

0954デフォルトの名無しさん2019/08/10(土) 23:49:36.20ID:L+B8OP2P
覚えてたらな

0955デフォルトの名無しさん2019/08/10(土) 23:59:39.51ID:6d2gRK68
そういや 【POSIX】 sh系互換 シェルスクリプトスレ ってのがあるやん

0956デフォルトの名無しさん2019/08/11(日) 00:00:12.33ID:GFStkW/c
え?どこに?

0957デフォルトの名無しさん2019/08/11(日) 00:01:16.28ID:GFStkW/c
ほんとだ!見逃してた! 次スレの関連リンクに追加しといたよ

【POSIX】 sh系互換 シェルスクリプトスレ
https://mevius.5ch.net/test/read.cgi/tech/1535195112/

0958デフォルトの名無しさん2019/08/11(日) 00:02:01.46ID:vE4Lr4uN
ほんとだw
2018/08/25
って、つい先日かと思ったら一年前かw

0959デフォルトの名無しさん2019/08/11(日) 00:02:46.24ID:vE4Lr4uN
スレ建ててくれたけど、どうかあちらを有効に使っていただきたい

0960デフォルトの名無しさん2019/08/11(日) 00:03:02.68ID:lm+uP+yI
あるのかよw
これで棲み分けできるな

0961デフォルトの名無しさん2019/08/11(日) 00:03:08.16ID:dSI5JGW8
一年も放置されててよく削除されなかったなw

0962デフォルトの名無しさん2019/08/11(日) 00:05:11.80ID:GFStkW/c
住処が二つになった!ドンッ!!

0963デフォルトの名無しさん2019/08/11(日) 00:10:56.97ID:GFStkW/c
ここはPOSIX準拠じゃないスレも対応?
fishとかの話題もどんどん扱うってことかな?

0964デフォルトの名無しさん2019/08/11(日) 00:13:32.87ID:GFStkW/c
fishってPOSIXと互換性はかなり低かったと思うんだが、
最終的に高い互換性を持たせるつもりなん?


https://www.excite.co.jp/news/article/Cobs_1862541/
> POSIX互換シェルとの互換性向上のために&&、||、!をサポート

fishの設計理念5原則(翻訳):使いやすさのための数々の気遣い
http://fish.rubikitch.com/design-document-ja/
> 可能な限り上記の目標を崩すことなく、fishはPOSIXの構文に従うべきです。

0965デフォルトの名無しさん2019/08/11(日) 00:14:43.26ID:vE4Lr4uN
最近では PowerShell なんてもあったり
どんどん扱うとかそういうんじゃなくて、そう否定するのはいないんじゃないかな
知らんけど

0966デフォルトの名無しさん2019/08/11(日) 00:15:10.68ID:GFStkW/c
http://fish.rubikitch.com/design-document-ja/

> ・ヒアドキュメントは パイプライン で echo コマンドを使うこととほとんど変わらないので不採用です。
> (訳注:「string trim 複数行文字列リテラル」でも代用可能)
> ・サブシェルとコマンド置換とプロセス置換はとても類似性が強いです。fishは コマンド置換 のみをサポートしています。
> それ以外はブロックまたはpsub標準シェル関数 で実現できます。
> ・別名定義 と シェル関数 の双方を持つことは混乱を招きます。特別にどちらも制限と欠点があるからです。
> fishの関数はいずれの構文の欠点も存在しません。
> ・POSIXのクオートの仕様は馬鹿げています!とくにシングルクォートは!!

やっぱ互換性はないと考えたほうが良いか

0967デフォルトの名無しさん2019/08/11(日) 00:25:40.31ID:GFStkW/c
おい、ついてこいよw
せっかくPOSIX以外の話もしてるんだから

0968デフォルトの名無しさん2019/08/11(日) 00:27:49.34ID:vE4Lr4uN
なんで「誰もが」興味があると思うのか

0969デフォルトの名無しさん2019/08/11(日) 00:29:16.73ID:GFStkW/c
関数定義の構文も違ってるみたいだ
https://fishshell.com/docs/current/tutorial.html#tut_functions

0970デフォルトの名無しさん2019/08/11(日) 02:09:43.49ID:EariAe7h
>>714-732
Ruby で作った

require "csv"

options = { :headers => true, :col_sep => "\t" }

table_1 = CSV.read( "hoge.tsv", options ) # 読み込み
table_2 = CSV.read( "huga.tsv", options ) # 読み込み

CSV.open( "hoge_huga.tsv", "w", options ) do |csv| # 書き込み
csv << %w(a b c d e) # header

table_1.zip( table_2 ).each do |one, two|
csv << [ one[ "a" ], one[ "b" ], two[ "c" ], two[ "d" ], one[ "e" ] ]
end
end

0971デフォルトの名無しさん2019/08/11(日) 02:44:21.08ID:GFStkW/c
>>970
勘違いしてるぞ。明確に書いてはないかもしれんが a b c d e はヘッダじゃなくてデータだ。
eachは不要。あといつになったら、その古いハッシュの書き方をやめるんだ?

訂正版
require 'csv'

options = { col_sep: "\t" }

table1 = CSV.read('hoge.tsv', options)
table2 = CSV.read('huga.tsv', options)

CSV.open('hoge_huga.tsv', 'w', options) do |csv|
table1.zip(table2) do |one, two|
csv << [one[0], one[1], two[0], two[1], one[2]]
end
end

0972デフォルトの名無しさん2019/08/11(日) 03:58:29.22ID:FACDvm3m
偉ぶりたい満々やな

0973デフォルトの名無しさん2019/08/11(日) 04:23:39.41ID:GTeyRs5o
長いと大変そう
ruby にもこういうのありそう

DB<8> @a = qw(a b e)
DB<9> splice @a, 2, 0, qw(c d)
DB<10> print @a
abcde

0974デフォルトの名無しさん2019/08/11(日) 04:38:47.36ID:++HFlOfG
>>973
それがRubyにはPerlやJavaScriptみたいなspliceがないんだよね
でも今回は、挿入するだけだから、 csv << one.insert(2, *two) が使えるね
順番をもっと柔軟に変えたいってなると面倒だけど

0975デフォルトの名無しさん2019/08/11(日) 05:27:14.15ID:oR4Xkpxd
>>660
そういやこんなのはいかんの?
てか、こういう答え既に出た?

#!/bin/sh

cf=0
for f
do
 if [[ cf -eq 0 ]]; then
  cf=1
 else
  echo -n ','
 fi
 echo -n "x${f}z"
done
echo ''

0976デフォルトの名無しさん2019/08/11(日) 16:04:36.86ID:++HFlOfG
>>975
echo -n はPOSIX準拠ではない。が、メンテナンスが続いている最新シェルはすべてサポートされている
と思っていたんだが、上の方で出てるboshが対応してなかったわw
やっぱりprintfを使うのが一番なんだろうな

0977デフォルトの名無しさん2019/08/11(日) 16:19:01.34ID:++HFlOfG
改めて調べ直してみたら、yashも-nに対応してなかった。
echo -n aaa ってやったら、 -n aaa って出力される。
単純な出力以外printfばっかり使ってたから忘れてたw

0978デフォルトの名無しさん2019/08/11(日) 16:34:27.13ID:++HFlOfG
>  if [[ cf -eq 0 ]]; then

bash依存する必要がないのに、bash依存してる例

0979デフォルトの名無しさん2019/08/11(日) 16:44:43.77ID:k+c7cOcw
重箱の隅が気になって仕方がないのね
そういうのは原理主義者としか思えないけどw
適切なスレが別にあるとわかったんだからそっちでどうぞ

0980デフォルトの名無しさん2019/08/11(日) 16:45:13.10ID:2JPwQqrg
やっぱりどこでも動くシェルスクリプトなんて幻想なんだね

0981デフォルトの名無しさん2019/08/11(日) 16:52:18.97ID:lm+uP+yI
bash で書くならシェバンで明示するべし

#!/usr/bin/env bash

0982デフォルトの名無しさん2019/08/11(日) 17:03:10.35ID:k+c7cOcw
間違いはそこだよなあ。単に
#!/bin/bash
と書こうとして、うっかり
#!/bin/sh
にしてしまった感じかな

0983デフォルトの名無しさん2019/08/11(日) 17:34:07.21ID:++HFlOfG
>>979
debianはbash依存をなくすのに苦労したらしいからね。

https://wiki.ubuntu.com/DashAsBinSh
> The major reason to switch the default shell was efficiency.
デフォルトシェルを(dash)に変更する理由は効率性です。

> Programs should be written to the standard,
>and if they use extensions they should declare them;
プログラムは標準で書くべきである。拡張を使うなら宣言しなさい。
正しい言葉だ。

拡張を使う理由がないのに効率性を落とす意味ないからね。

0984デフォルトの名無しさん2019/08/11(日) 17:41:28.14ID:++HFlOfG
>>980
どこでも動くために、POSIXに準拠することの大切さがわかるよね。

0985デフォルトの名無しさん2019/08/11(日) 17:42:11.13ID:++HFlOfG
>>982
うっかりじゃなくて、無知だと思うよ。
知ってる人が指摘してあげないとね。

0986デフォルトの名無しさん2019/08/11(日) 17:46:23.18ID:k+c7cOcw
傲慢だな。そうじゃないと今までの自分のレスが馬鹿みたいだから...
知らないのかもしれないが、/bin/sh が bash の場合、ちゃんとは動かない

てか、あっちのスレを行けよ

0987デフォルトの名無しさん2019/08/11(日) 17:49:05.08ID:k+c7cOcw
ああ、/bin/sh が bash で、しかも、bash が 3.x の場合かもしれない
/bin/sh が bash であっても、#!/bin/sh だと>>975のスクリプトはうまく動かないのはね。なので、うっかりとしか思えんな

0988デフォルトの名無しさん2019/08/11(日) 17:50:38.09ID:++HFlOfG
> /bin/sh が bash の場合、ちゃんとは動かない

だからちゃんと動かないコードを直すべきでは?
/bin/shはdash, bash, ash, ksh, zsh, mksh のいずれかの可能性がある(他にもあるかもしれない)

0989デフォルトの名無しさん2019/08/11(日) 17:51:46.41ID:k+c7cOcw
>>982って言ってるだろ
/bin/sh が bash であっても、#!/bin/sh だと>>975のスクリプトはうまく動かない
ね。詳しく正しくは

0990デフォルトの名無しさん2019/08/11(日) 17:57:05.79ID:++HFlOfG
>>987
全角スペースは見やすくするために流石にわざとだとして、
>>975のスクリプトはbash 2.x以上であれば動くよ。確認済み。
(bash 1系の環境は作ってないのでわからん)

Debian、Ubuntuであれば /bin/sh じゃ動かないので
手元のMacかな?それで試しただけだろうね。

0991デフォルトの名無しさん2019/08/11(日) 17:59:38.45ID:++HFlOfG
>>989
/bin/shのシンボリックリンクの実体がbash、
つまりposixモードの話をしてるのかもしれないけど、
posixモード(set -o posix)であっても [[ ]] は認識しちゃうからね。

bashのposixモードは、挙動の違いをposixに合わせるだけで
posixにはない拡張機能を無効にすることはないみたい。

0992デフォルトの名無しさん2019/08/11(日) 18:01:22.10ID:++HFlOfG
なので>>989が何を言いたいのかわからんね。
具体的に、どういう理由でbashで>>975が動かないのか
どのようなエラーが出力されるのかを言えば
説得力も出ると思うよ。

レス待ってるねw

0993デフォルトの名無しさん2019/08/11(日) 18:01:36.14ID:k+c7cOcw
#!/bin/sh
てか、sh とコマンド打って起動してでも、echo -n hello は -n hello と表示されるんだなあ。うちのはw
type echo しても echo is a shell builtin だしね。てか、/bin/echo は -n が効くやつだけど

0994デフォルトの名無しさん2019/08/11(日) 18:02:28.72ID:k+c7cOcw
ちなみに、bash --posix で起動しても echo -n hello は -n hello にはならん、なぞww

0995デフォルトの名無しさん2019/08/11(日) 18:07:05.61ID:++HFlOfG
> echo -n hello は -n hello と表示されるんだなあ。
POSIXのechoには-nはないからね。-nに依存するコードを書いてはいけない。
POSIX準拠で書く理由が増えたね。

0996デフォルトの名無しさん2019/08/11(日) 18:07:37.64ID:k+c7cOcw
誰かさんも使ってると言っていた環境なんだけどなw
$ which sh
/bin/sh
$ ls -l /bin/sh
-r-xr-xr-x 1 root wheel 618480 5 4 16:05 /bin/sh
$ sh --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
$ sh
$ echo -n hello
-n hello
$ exit
exit
$ bash --posix
$ echo -n hello
hello$

0997デフォルトの名無しさん2019/08/11(日) 18:08:18.76ID:++HFlOfG
ま、案外
> /bin/sh が bash であっても、#!/bin/sh だと>>975のスクリプトはうまく動かない
の理由は全角スペースが入ってるからだったりしてねw

0998デフォルトの名無しさん2019/08/11(日) 18:08:27.92ID:k+c7cOcw
>>995
自説の繰り替えしだけか。しょうもない

0999デフォルトの名無しさん2019/08/11(日) 18:09:01.47ID:k+c7cOcw
>>997
よく読めよ。都合が悪くて妄想モードか?

1000デフォルトの名無しさん2019/08/11(日) 18:09:45.54ID:lm+uP+yI
1000!

10011001Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 40日 19時間 5分 18秒

10021002Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php

レス数が1000を超えています。これ以上書き込みはできません。