2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2019/10/25(金) 00:08:45.53 ID:6btPTvif.net
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。

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

2 :デフォルトの名無しさん:2019/10/25(金) 00:09:51.40 ID:6btPTvif.net
・特記なき場合、POSIX準拠シェルが既定です
 POSIX準拠シェルとBourneシェルの区別はついていますか?BourneシェルはUNIXで過去広く使われたシェルで
 多くの亜種が存在します。Bourneシェルの後継で標準化されたものがPOSIX準拠シェルです
  参考 https://unix.stackexchange.com/questions/145522/
 POSIX準拠シェルは(d)ash, bash, zsh, (m)ksh, yash, posh, (p)boshです
 特定のシェル(特にPOSIX準拠シェルではないfish, (t)csh等)の専用機能に依存する場合は明示しましょう
・デフォルトシェルのシバンはBourneシェル時代からの伝統で#!/bin/shを使用します。ただしその実体はOSによって様々です
  Debian,Ubuntu … dash
  CentOS … bash
  FreeBSD … ash
  Solaris,OpenBSD … ksh
  macOS … 改変版bash
  android … mksh
 自覚なきbashism、シバンが#!/bin/shなのにbashに依存する構文を使っていませんか?#!/bin/shを使うならシェル依存は厳禁です
 macOSのbashはSingle UNIX Specificationに準拠するために改変されており一部動作が異なるので注意しましょう
・Bourneシェルは既にレガシーです
 歴史的資料 https://www.in-ulm.de/~mascheck/
 Bourneシェル≒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
・POSIXに準拠しましょう
 有用なリンクは https://en.wikipedia.org/wiki/POSIX にまとめられています
 最新の仕様はこちら http://pubs.opengroup.org/onlinepubs/9699919799/ (左上の「Shell & Utilities」から)
・csh/tcshでのシェルスクリプトは*まったく推奨しません*
  参考 http://www.speech-lab.org/~hiroki/csh-whynot.euc
・Linux/UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。Manページや各種リンクを見ましょう
 aproposやman -kでそれらしい単語による簡単な検索もできます
・ワイルドカードは正規表現ではありません
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな

3 :デフォルトの名無しさん:2019/10/25(金) 00:10:25.47 ID:6btPTvif.net
関連スレ

【Bash】Windows Subsystem for Linux【WSL】6
https://mao.5ch.net/test/read.cgi/linux/1560665525/

Bashでプログラミング [転載禁止](c)2ch.net
https://mao.5ch.net/test/read.cgi/linux/1443885102/

シェルスクリプト総合 その28
https://mevius.5ch.net/test/read.cgi/unix/1533154936/

zsh その7
https://mevius.5ch.net/test/read.cgi/unix/1337844883/

【POSIX】UNIXプログラミング【BSD】 [転載禁止](c)2ch.net
https://mevius.5ch.net/test/read.cgi/unix/1443103705/

4 :デフォルトの名無しさん:2019/10/25(金) 00:31:55.29 ID:pN2Np6rx.net
隣で仕事してる他社のチームが、新人にコマンドプロンプトのことをMS-DOSって教えてて笑える

5 :デフォルトの名無しさん:2019/10/25(金) 02:33:05.14 ID:IsBuDbrd.net
業界内で技術用語を正確に把握している人が果たして何人いるんだろうか?

6 :デフォルトの名無しさん:2019/10/25(金) 15:16:28.60 ID:L9QL6FGO.net
コマンドプロンプトのことをなんと教えるか?

× MS-DOSのようなもの
○ ハドソンのゲーム、バニーガール殺人事件のようなもの
https://middle-edge.jp/articles/bFwpM

7 :デフォルトの名無しさん:2019/10/25(金) 18:14:14.63 ID:ggZuLyhL.net
Win9xまではコマンドプロンプトのアイコンがMSDOSだったんだぜ

8 :デフォルトの名無しさん:2019/10/25(金) 19:44:43.63 ID:f89Z34lq.net
あれって MS-DOS プロンプトって名前じゃなかった?
Windows NT の方はコマンドプロンプト。

9 :デフォルトの名無しさん:2019/10/25(金) 21:05:38.68 ID:AWtm0G4L.net
先輩がコマプロとか言っててキモかったな(´・ω・`)

10 :デフォルトの名無しさん:2019/10/25(金) 21:16:19.65 ID:Qd2+OiXZ.net
そういう誰も効かない変な略し方ってどうやって生まれるんだろうね?
俺の知り合いは、AMDをアーマーデーとか言ってた。なんで伸ばすん?

11 :デフォルトの名無しさん:2019/10/25(金) 23:38:51.04 ID:9ZGj0mXw.net
ドイツ語読みだとしてもマーがおかC

12 :デフォルトの名無しさん:2019/10/25(金) 23:59:50.22 ID:6xV0MpQs.net
そういえばもうDOSプロンプトって言い方しなくなったな

13 :デフォルトの名無しさん:2019/10/26(土) 00:00:29.42 ID:hrL9FWKp.net
XP以降しか使ったことがないって人も増えたからね

14 :デフォルトの名無しさん:2019/10/26(土) 16:02:34.81 ID:5U6kcXeJ.net
MS-DOS の話をしても現在の Windows で再現できないという理由で嘘つき呼ばわりされる。

15 :デフォルトの名無しさん:2019/10/26(土) 16:33:49.92 ID:+M+pJ73c.net
TRUE=$([ 0 = 0 ];echo $?)
FALSE=$([ ! $TRUE ];echo $?)

FLAG=$TRUE or $FALSE


↑クソコード

理由
true / false を使えばいい
true / false がない環境があるかもという理屈なら、 [ がない環境もあるかもと考えろ
set -e のときに動かない
[ ! $FALSE ]; echo $? が 1($FALSEと同じ値)を返すことに気づいていない
サブシェルを使うのもアホらしい

たったこれだけのコードに、こんだけのツッコミができるとはw

16 :デフォルトの名無しさん:2019/10/26(土) 16:35:45.72 ID:+M+pJ73c.net
TRUE=0
FALSE=1

と書いたほうが遥かにマシだが、
これでも、[ $TRUE ] も [ $FALSE ] も共に 0(成功)を返すので
なんだかなーって感じw

17 :デフォルトの名無しさん:2019/10/26(土) 16:38:37.76 ID:+M+pJ73c.net
>>15は [ ! $TRUE ] ← こういうコードを書いてますが、
つまりこういうことですよ

FLAG=$FALSE

if [ $FLAG ]; then
 echo ここが実行されるwww
fi

18 :デフォルトの名無しさん:2019/10/26(土) 16:49:43.23 ID:+M+pJ73c.net
変数($FLAG)に、0 or 1 を入れてる人は、

こういう書き方をしたいかんのやで
if [ $FLAG ]; then
if [ ! $FLAG ]; then

if [ $FLAG -eq $TRUE ]; then とか
if [ $FLAG -ne $TRUE ]; then って書かないといかん

19 :デフォルトの名無しさん:2019/10/26(土) 17:19:51.21 ID:swDBEFOl.net
if $FLAG ; then

書き方も知らんらしいw

20 :デフォルトの名無しさん:2019/10/26(土) 20:30:57.76 ID:+M+pJ73c.net
0: コマンドが見つかりません

www

21 :デフォルトの名無しさん:2019/10/26(土) 21:19:29.63 ID:axNoNf0W.net
https://stackoverflow.com/questions/2953646/how-can-i-declare-and-use-boolean-variables-in-a-shell-script

22 :デフォルトの名無しさん:2019/10/26(土) 21:55:28.23 ID:NL9ts++5.net
>>21
Mikuの回答とやらで混乱しすぎててわろたw

ま、普通考えて、変数の内容を実行するのは危険だわな

23 :デフォルトの名無しさん:2019/10/26(土) 23:37:13.88 ID:9r5pzvRl.net
いつものとっちゃんが来てたのか

24 :デフォルトの名無しさん:2019/10/26(土) 23:42:04.85 ID:Mu/CRk1W.net
0: コマンドが見つかりません
を確かめようと、WSLで実行したらエラー無く実行されたw

/mnt/c/WINDOWS/system32/0
というファイルが有る。

サイズゼロだから問題ないが、なんだこれw

ちなみに1はないのでエラーになる

25 :デフォルトの名無しさん:2019/10/27(日) 12:52:55.51 ID:HgLbCoih.net
>>9
DECのVAX上で動くシェルスクリプトのようなものでコマプロってあったな
先輩からはコマンドプロシジャーの略って聞いたけど
今調べると「DCL および MCR コマンド言語インタプリタ」って言うのっぽい
適当にぐぐって出てきたPDFに載ってるそれらしい用語だけどさ
20年以上前の話だ、なつかしい・・・

26 :デフォルトの名無しさん:2019/10/27(日) 23:45:43 ID:seZQk3at.net
質問スレでこっちでやれってレスもらったのできました。
そのまま同じ書き込みします。

リモートで最新の1つを残してログを削除したいです。
$ ssh host 'rm -f `ls -1t /home/app/201910/*.log | tail -n+2`'

これを複数のディレクトリで実行しようとしたのが、
var1=201909
var2=201910
array=($var1 $var2)

for var in ${array[@]}
do
ssh host rm -f $(tail -n+2 $(ls -1t /home/app/${var}/*.log))
done
なのですが、ls -1t /home/app/${var}/*.logがローカルで実行されてしまい
ます。(ls: /home/app/201909/*.log: No such file or directory)

うまくいくようにアドバイスなどいただけるとうれしいです。

27 :デフォルトの名無しさん:2019/10/28(月) 00:08:46 ID:+rzOrIi/.net
rm以降をクウォートしてないからじゃないの?

28 :デフォルトの名無しさん:2019/10/28(月) 00:11:36 ID:UoBv9hmi.net
ssh host 'ls -1t /home/app/'${var}'/*.log | tail -n +2 | xargs rm -f'

とか

29 :デフォルトの名無しさん:2019/10/28(月) 00:25:54 ID:IRy7CIwD.net
クォートと中なら、平気、なの

30 :デフォルトの名無しさん:2019/10/28(月) 00:28:19 ID:XocDEeOH.net
この程度でいちいちbash依存しないでほしい

set -- 201909 201910

for var in $@

31 :デフォルトの名無しさん:2019/10/28(月) 00:34:13 ID:UoBv9hmi.net
for loop の場合、デフォルトでは "$@" が対象になるので

for var;do ... ;done

と書ける

32 :デフォルトの名無しさん:2019/10/28(月) 00:48:08 ID:h0m+PRW8.net
>>27
クォートしても同じでした。
ls: /home/app/201909/*.log: No such file or directory

>>28
リモート側が
/dev/tty を読み込むために開けませんでした: そのようなデバイスやアドレスはありません
を返してきました。

>>30
ハゲろ!

33 :デフォルトの名無しさん:2019/10/28(月) 00:49:49 ID:+rzOrIi/.net
>>26
ssh host 'rm -f $(tail -n+2 $(ls -1t /home/app/'"${var}"'/*.log))'

ってやればいいと思うけど
>>28の人が書いたようにパイプ使ったほうが読みやすい

34 :デフォルトの名無しさん:2019/10/28(月) 00:50:45 ID:UoBv9hmi.net
$HOME/.ssh/config に RequestTTY とか書いてない?

35 :デフォルトの名無しさん:2019/10/28(月) 01:18:31 ID:h0m+PRW8.net
考えてくれて、レスをくれてありがとうございます。

>>28>>31
for var;do ssh host 'ls -1t /home/app/'${var}'/*.log | tail -n +2 | xargs rm -f' ;done

hoge.sh: 行 38: 予期しないトークン `done' 周辺に構文エラーがあります
をリモート側が返しました。

>>33
+ ssh host 'rm -f $(tail -n+2 $(ls -1t /home/app/'"${var}"'/*.log))'
bash: 警告: command substitution: ignored null byte in input
bash: /bin/rm: 引数リストが長すぎます

>>34
リモートには~/.ssh/configは無くて、ローカルはUser、HostName、Port、
IdentityFile、ServerAliveIntervalを書いてます。

取り急ぎ報告します。エラーについては調べてみます。

36 :デフォルトの名無しさん:2019/10/28(月) 01:42:31.88 ID:h0m+PRW8.net
bash: /bin/rm: 引数リストが長すぎます
についてはしかたないので>>28さんのパイプを使うことにしました。

/dev/tty を読み込むために開けませんでした
についてはsshにtオプションをつけました。

`done' 周辺に構文エラーはこれから調べます。

とりあえず当初の目的は達成できました。
みんな親切にありがとうございます。

37 :デフォルトの名無しさん:2019/10/28(月) 13:32:08.60 ID:S2HNyEoD.net
curl ja.wttr.in/tokyo
curl cheat.sh/ls
これ以外に端末で使える便利サイトってある?

38 :デフォルトの名無しさん:2019/10/28(月) 13:35:16.78 ID:tEsfLTI+.net
宣伝おつ

39 :デフォルトの名無しさん:2019/10/29(火) 09:50:33 ID:zCzSjgo7.net
sshを複数回動かすよりも一回で全部やらせちゃった方が効率良いような気がするんだ

40 :デフォルトの名無しさん:2019/10/29(火) 11:14:16.19 ID:2AEjd6SF.net
なにそれ、よさそう。
でもわたしの頭ではどうしたらよいものやら。。

41 :デフォルトの名無しさん:2019/10/29(火) 12:20:30.44 ID:zCzSjgo7.net
forのループごとsshで引き渡せばいいじゃん。1行の長いシェルスクリプトってことね。

42 :デフォルトの名無しさん:2019/10/29(火) 13:55:53.48 ID:2AEjd6SF.net
まだ帰宅していないので考えただけですが、
ls | tail | rm したいディレクトリが11個あって、
ディレクトリのpwdは/home/'"$var"'/'"$i"'/ みたいに2箇所変数にしてます。
それをssh1行でループを送れるバエた方法があるますか?

43 :デフォルトの名無しさん:2019/10/29(火) 13:59:15.42 ID:2AEjd6SF.net
たしかにsshのループの時にいちいち
Connection to xxx.xxx.xxx.xxx closed
が出てうざかったんですよね。

44 :デフォルトの名無しさん:2019/10/29(火) 14:00:01.92 ID:gns1i7FP.net
ヒアドキュメントにすればいいんじゃない

#!/bin/sh

cat <<'EOS' | ssh host sh
var1=201909
var2=201910

set -- "${var1}" "${var2}"

for var
do
ls -1t /home/app/"${var}"/*.log | tail -n +2 | xargs rm -f
done
EOS

45 :デフォルトの名無しさん:2019/10/29(火) 14:19:01.08 ID:gns1i7FP.net
と思ったけど、リモートホストのどこかにスクリプトファイルを置いて

ssh host /path/to/script

とかやればいいんじゃないかな

> たしかにsshのループの時にいちいち
> Connection to xxx.xxx.xxx.xxx closed
> が出てうざかったんですよね。

なんでこのメッセージが表示されるんだろう…やっぱり pseudo tty を
使ってるよね

46 :デフォルトの名無しさん:2019/10/29(火) 14:32:50.27 ID:CowX2GWO.net
CI/CD で使う、Task Runner みたいな方が良いかも

Ruby なら、Rake を使った、Capistrano とか、
Thor とか

47 :デフォルトの名無しさん:2019/10/29(火) 14:37:21.30 ID:g8zM1lJr.net
rubyはけっこうです

48 :デフォルトの名無しさん:2019/10/29(火) 15:00:21.96 ID:2AEjd6SF.net
> ヒアドキュメント
> リモートホストのどこかにスクリプト
なるほど!それならわたしでも理解できます!

> Connection to xxx.xxx.xxx.xxx closed
これは、
ssh host 'ls -1t /home/app/'${var}'/*.log | tail -n +2 | xargs rm -f'
としたときに、
/dev/tty を読み込むために開けませんでした: そのようなデバイスやアドレスはありません
と言われてしまったので、sshに-tをつけてから出るようになりました。
サーバーのアプリが集めた写真をscpでダウンロード→
→ダウンロードした写真を削除→アプリのログを削除
って流れのスクリプトなのでやたらとConnection to xxx.xxx.xxx.xxx closedが出ます。

49 :デフォルトの名無しさん:2019/10/29(火) 15:57:57.38 ID:zCzSjgo7.net
sshで接続する先のサーバに予めシェルスクリプト送り込んでおいてsshで実行だけするという手もあるな。
あまりにも長くて複雑な場合はその方が楽だと思う。

ただし、送り込んでから実行するまでの間に何者かによって別のファイルに置き換えられてしまったら終わりなのでその心配のない環境でしかできない。

50 :デフォルトの名無しさん:2019/10/29(火) 15:59:43.78 ID:zCzSjgo7.net
うう。リロードし忘れて書いたら既に同じようなのが書かれている。orz

51 :デフォルトの名無しさん:2019/10/29(火) 16:01:56.26 ID:spBBwL/I.net
やり方は忘れたが、ローカルでgzにしたものをワンライナーで
送ってリモートに保存せずに実行っていうのをやったことがある気がする
かもしれないけど、保存していたかもしれない

52 :46:2019/10/30(水) 15:36:46.01 ID:p2ffZ2o0.net
環境構築のChef は、サーバーに、Ruby をインストールする。
そこで、サーバーに、Ruby Script を転送して、Rubyで実行する

一方、Ansible は、サーバーに、Python をインストールしない

他にも、Capistrano, Terraform などもある

53 :デフォルトの名無しさん:2019/10/30(水) 18:02:20.30 ID:ssr4q2PY.net
>>52
きたーーー!!!

54 :デフォルトの名無しさん:2019/10/31(木) 17:56:20.75 ID:pBbgzdOe.net
cshで書いたスクリプトの途中でキーから入力をしたいんですが
なんという命令で実現できますか?

55 :デフォルトの名無しさん:2019/10/31(木) 18:01:50.06 ID:wR8wpXdO.net
set key_input = $<

56 :デフォルトの名無しさん:2019/10/31(木) 19:36:28.51 ID:pBbgzdOe.net
>>55
サンクス(´・ω・`)

57 :デフォルトの名無しさん:2019/11/06(水) 17:06:15.24 ID:4kXKpMLv.net
aliasってxargsじゃ使えないけど使えたらまずいんだろうか
関数ならexportすればできるけどさ

58 :デフォルトの名無しさん:2019/11/06(水) 19:12:11.78 ID:wTTuQQRz.net
>>57
まずいとかいうわけじゃなくて、xargsは外部コマンドだよ。
例えば、俺がC言語であるプログラムを作ったとする。
俺のプログラムから、親プロセス(シェル)がなにかもわからないのに、
そのシェルで定義したメモリ内部のものを呼び出せるわけがない

59 :デフォルトの名無しさん:2019/11/06(水) 19:12:36.64 ID:wTTuQQRz.net
関数も無理やろ?

60 :デフォルトの名無しさん:2019/11/06(水) 19:20:58.71 ID:wTTuQQRz.net
たたbashに関数をexportできる機能があるってのは不思議なんだよなw

まあなんか変なことしてるんだろう。で気にしてなかったけどさ、
少し試してみたら、bashからbashを起動したときには使えるが、
zshだと使えないし、bash→dash→bashの流れでも使えない。
どういう仕組なんだろう?

61 :デフォルトの名無しさん:2019/11/06(水) 19:34:34.77 ID:OvjaMqE0.net
echo 'Hello World' | xargs -I@ bash -c $'shopt -s expand_aliases;alias p="echo";\n p @'

62 :デフォルトの名無しさん:2019/11/07(木) 00:18:43.96 ID:dfqCliYv.net
func(){ echo $@;}
export -f func
echo foo | xargs func
xargs: func: そのようなファイルやディレクトリはありません
echo foo | xargs -I@ bash -c 'echo @'
foo
関数ならこうだな

xargsでaliasはbashだと無理だからtcshでやれってstack overflowで見た

63 :デフォルトの名無しさん:2019/11/07(木) 08:59:49.28 ID:C0Y8MuYI.net
macては動かないのでwindows使ってくださいみたいな暴論

64 :デフォルトの名無しさん:2019/11/07(木) 11:05:05.20 ID:cfhO2vSD.net
>>60
export -f は環境変数に
BASH_FUNC_関数名%%=関数を文字列
を設定してるだけだからじゃね。bashは起動時に環境変数にそゆのがあったら関数とし展開するから使える、その他はそんな環境変数知らんから単なる環境変数のままな感じな
dashは起動すると、その環境変数が引き継がれないからそこで断ち切られる感じかな
関数にしろaliasにしろサブプロセスに引き継ぐという考え自体がイレギュラーな感じだな

65 :デフォルトの名無しさん:2019/11/07(木) 11:11:30.53 ID:sEmiRyTj.net
>>64
やっぱり環境変数経由なのか?
でもちゃんと確認したんだけどなw

まさかbash以外の外部コマンドを実行するときに削除してるとか?
そしてbashの中からexport -pとかしたときは省いてるとか?

66 :デフォルトの名無しさん:2019/11/07(木) 11:19:16.71 ID:cfhO2vSD.net
>>65
bash -> zsh -> bash
で、bashでは関数になってるけど。zshでも環境変数には存在する
環境変数の引き継ぎってどうなってたかなあ

67 :デフォルトの名無しさん:2019/11/07(木) 11:26:10.68 ID:mwfKyddL.net
なんかもろにそれっぽいのがあった。dashは一般的でないような名前のは削除するらしい
https://unix.stackexchange.com/questions/498905/why-is-my-bash-func-foobar-environment-variable-unset-in-shell-subprocesses

68 :デフォルトの名無しさん:2019/11/07(木) 11:52:29.35 ID:sEmiRyTj.net
ようやく見れたw
envで見れるね。export使ってた。

69 :デフォルトの名無しさん:2019/11/07(木) 11:53:35.24 ID:sEmiRyTj.net
この変数使えば、なにか面白いことできそう。
ってか、xargsの引数にできないか?

70 :デフォルトの名無しさん:2019/11/07(木) 11:54:11.02 ID:sEmiRyTj.net
bashを介せば

71 :デフォルトの名無しさん:2019/11/08(金) 00:07:00.88 ID:jWGBsuvq.net
alias xargs='xargs '
echo *txt | xargs ll
.basurcの登録分はこれでもいける

72 :デフォルトの名無しさん:2019/11/14(木) 12:41:11.56 ID:RaS+/sOM.net
uucpとかって今時どういう活用法あるかな?

73 :デフォルトの名無しさん:2019/11/14(木) 12:59:55.09 ID:GaAZ8ORG.net
TrailBlazer でも手に入れたのか

74 :デフォルトの名無しさん:2019/11/27(水) 15:42:28 ID:JZevxkSS.net
kill とtrapでソフトタイマ作ってみた。需要あるかな

75 :デフォルトの名無しさん:2019/11/27(水) 16:34:50.24 ID:KOWJoLHR.net
sleepと何が違うん?

76 :デフォルトの名無しさん:2019/11/27(水) 18:43:12.26 ID:9SXmP3sk.net
SECONDSとの比較だからずれの蓄積がない。
平行処理が出来る。

77 :デフォルトの名無しさん:2019/11/27(水) 18:48:52.87 ID:KOWJoLHR.net
ずれの蓄積に関しては、sleepでも補正していけばなんとかなるので。
並行処理はまあそうだね。需要あるんじゃない?
コード見てなにかに使えそうなら使うかも
どこまで作り込んでるのかしらないが

78 :デフォルトの名無しさん:2019/11/28(木) 06:15:51.80 ID:f/6vs/+B.net
シグナル発生をバックグランドで動かしシェルスクリプトのプロセスに送るのがかなめ。

79 :デフォルトの名無しさん:2019/11/28(木) 07:03:59.17 ID:uZo2jF8i.net
うん。それはわかるw
前に条件を満たすまで無限ループ+タイムアウト機能ってのを実装したことがあるから
結局複雑な割にタイムアウトすることはまず無いので廃止したけどさ

80 :デフォルトの名無しさん:2019/11/28(木) 07:05:43.89 ID:uZo2jF8i.net
もしここに書いたらレビューするかもね
内容が気に入ればだけど

81 :デフォルトの名無しさん:2019/11/28(木) 08:08:54.32 ID:f/6vs/+B.net
いっぺんにアップできないから小出し。
#! /bin/bash

MAX_TIMER=10;

OLD_SECONDS=$SECONDS;
while true; do
cp_SECONDS=$SECONDS;
if [ $cp_SECONDS -ne $OLD_SECONDS ]; then
kill -SIGINT $$;
OLD_SECONDS=$cp_SECONDS;
fi
sleep 0.5;
done &

82 :デフォルトの名無しさん:2019/11/28(木) 08:09:31.03 ID:f/6vs/+B.net
for ((aa = 0; aa < MAX_TIMER; aa++)); do
tim_flg[$aa]=0;
tim[$aa]=0;
#echo ${tim_flg[*]}
done;

83 :デフォルトの名無しさん:2019/11/28(木) 08:09:55.57 ID:f/6vs/+B.net
trap '
for ((aa = 0; aa < MAX_TIMER; aa++)); do
if [ ${tim_flg[$aa]} -eq 1 ]; then
if [ ${tim[$aa]} -gt 0 ]; then
tim[$aa]=$((tim[$aa] - 1));
fi
fi
done
printf "%3d" ${tim[*]};
echo ":" $(date -R);
' SIGINT

84 :デフォルトの名無しさん:2019/11/28(木) 08:11:04.34 ID:f/6vs/+B.net
for((nn=0; nn < 10; nn++)); do
tim_flg[$nn]=1;
done

while true; do
for((nn=0; nn < 10; nn++)); do
if [ ${tim[$nn]} -eq 0 ]; then tim[$nn]=$((nn + 2)); fi
done

sleep 0.6
done;
終わり

85 :デフォルトの名無しさん:2019/11/28(木) 08:24:45.92 ID:uZo2jF8i.net
なんか動いてるけど、何やってるのかわからんなw
とりあえずCTRL+Cで停止しなかった。

86 :デフォルトの名無しさん:2019/11/28(木) 08:29:37.54 ID:f/6vs/+B.net
動作を確認するためタイマーのカウントとセットを繰り返しています。
終了するためにはSIGKILLを与えてください。

87 :デフォルトの名無しさん:2019/11/28(木) 08:30:36.19 ID:uZo2jF8i.net
しばし読んでみたけど、やっぱりわからんw

これ指定したn秒ごとにシグナル送るんじゃないのか?
tim配列とかtim_flgの意味がさっぱりだ

88 :デフォルトの名無しさん:2019/11/28(木) 08:41:39.82 ID:uZo2jF8i.net
簡単な所から。まずシグナルはSIGはいらんぞ。
bash限定ならそれでもいいがPOSIX的には無いほうが正しい。
INTはCTRL-Cなので、USR1またはUSR2、もしくはSIGHUPとかの方が良い。
セミコロンはC言語じゃないんだから行を継続しないときにはつけないのが一般的

89 :デフォルトの名無しさん:2019/11/28(木) 08:42:09.42 ID:f/6vs/+B.net
各タイマが0になったらなんかをちょっとやり、またタイマをセットするというプログラムです

tim配列はタイマ本体です。tim_flg配列はタイマ使用/不使用のフラグです。

90 :デフォルトの名無しさん:2019/11/28(木) 08:49:25.10 ID:uZo2jF8i.net
やっと理解したが、これ説明なしに理解するの大変だぞw
本質的じゃないコードが複雑でそっちのほうが多すぎる。

91 :デフォルトの名無しさん:2019/11/28(木) 08:51:32.36 ID:uZo2jF8i.net
tim_flgの意味がないな。いや意図は想像できる。(というか>>89に書いてあるか)
サンプルとしてはノイズにしかなってないので理解ができない。

92 :デフォルトの名無しさん:2019/11/28(木) 21:14:01.96 ID:uBUVzLWV.net
宿題の添削をしてやるとか親切たなw

93 :デフォルトの名無しさん:2019/11/28(木) 21:36:47.47 ID:asJppHFe.net
目的は、bash依存すんな。って言うことだったんだがなw
流石にbash依存してる部分が、本質的じゃない所ばかりだとやる気が。
バッサリ削ったら簡単に、bash依存なくせるんでどうしようかなと思いながらレス待ちw

94 :デフォルトの名無しさん:2019/11/28(木) 23:49:59.71 ID:RaRUIeaw.net
bash依存しまくりで
https://wandbox.org/permlink/EHSiHk726Bn4qvVO

95 :デフォルトの名無しさん:2019/11/29(金) 00:53:33.34 ID:Fh79+8D6.net
あんまりソフトタイマに有用性を感じてもらえないようで残念でした。

96 :デフォルトの名無しさん:2019/11/29(金) 01:09:45.97 ID:IIqk2+5U.net
timeoutでやっつけ

97 :デフォルトの名無しさん:2019/11/29(金) 02:19:44 ID:XcyRQJ1W.net
>>95
タイマに有用性がないんじゃなくて
君が作ったスクリプトに有用性がなかったんだよ

98 :デフォルトの名無しさん:2019/11/29(金) 04:30:20 ID:9RHOSbKH.net
>>94
めんどくせーから、もうそれでいいやw

その程度でbash依存するな
https://wandbox.org/permlink/Uh4eQX682YzoK8rn

99 :デフォルトの名無しさん:2019/11/29(金) 05:10:07 ID:hA38q2SN.net
おれおれかよ

100 :デフォルトの名無しさん:2019/11/30(土) 00:04:41.28 ID:FMRNVBPU.net
Wgetであるサイトの特定のディレクトリ配下の特定のファイルを
ダウンロードしたくて下記のコマンドを書いてもルートのindex.html
しかダウンロードしてくれません。

これは何がまずいのでしょうか?

wget -r -A Download拡張子 -I /Downloadディレクトリ URL

101 :デフォルトの名無しさん:2019/11/30(土) 00:53:41.92 ID:KUL76oc2.net
オプションに -e robots=off -U mozilla でも付けてみたら上手く行くかも

102 :デフォルトの名無しさん:2019/11/30(土) 00:54:25.61 ID:czFcPKLy.net
碌に調べずの返答でアレなんだが多分訪問先のサイトがファイル一覧
を返すのを禁止してる(apache httpd だと Indexes オプションが有効
になってない)からだと思う

103 :デフォルトの名無しさん:2019/11/30(土) 13:20:31.41 ID:f33nsdyy.net
リファラの偽装が必要かも。知らんけど

104 :デフォルトの名無しさん:2019/11/30(土) 16:49:40.30 ID:mvBIEviw.net
googleはbashがデフォルト

105 :デフォルトの名無しさん:2019/12/01(日) 11:47:31.42 ID:0pH8jk7+.net
bash/zsh依存しまくりで
https://wandbox.org/permlink/moif346imXqiuDxD

そんなのが仮に必要でも
trap 'date -R' USR1

for (( i=1 ; i <= 10 ; i++ )); do
( sleep $i; kill -USR1 $$ ) &
done

wait
でいいだろとしか思わんけどw

106 :デフォルトの名無しさん:2019/12/01(日) 19:22:22.28 ID:IoGKXgrY.net
>>91
tim_flgをゴミ扱いしたこいつがソフトタイマを理解していない。

107 :デフォルトの名無しさん:2019/12/01(日) 19:49:41.33 ID:YWi4MX0G.net
このサンプルでは1固定なんだからゴミやろ

108 :デフォルトの名無しさん:2019/12/02(月) 22:02:29.21 ID:9nn8K+iP.net
親ディレクトリ
-子ディレ クトリ(1)
 file(1).txt
 file ().txt
-子デ ィレクトリ(2)
 file(2) .txt
-子ディレクトリ(3)
 fil e(3).txt

ディレクトリとファイル名の半角スペースと半角の()を_で置換したいのですが
どうやればいいのでしょうか
for dir in $(ls -d */); do
for f in ${dir}*; do
mv "$f" `echo $f|sed -e 's/[ ()]/_/g'`
done
done
これでディレクトリ名とファイル名はどうにかなったのですが、、
一回目ではディレクトリ名が変換されてしまうのでファイル名が変換されず
対応策として同じコードを2回実行してファイル名も変換しています
まず一回目にディレクトリ名を変換するために
for dir in $(ls -d */); do
mv "$dir" `echo $dir|sed -e 's/[ ()]/_/g'`
done
をやってみたのですが、statがなんやらと警告が出てきます

109 :デフォルトの名無しさん:2019/12/02(月) 22:13:56.47 ID:cDa5fVnx.net
そういう用途なら、forとかlsとか使わないでfind使え

110 :デフォルトの名無しさん:2019/12/02(月) 22:15:41.19 ID:cDa5fVnx.net
いきなりstatがでるような事はやめて、
echo mv なんとか かんとか で実行命令を表示するようにしろ
怖すぎるわ。それやればなんとかなるだろ

111 :デフォルトの名無しさん:2019/12/02(月) 22:19:56.11 ID:agtAae1a.net
rename 関係はperlで試せる dry run 作ってる
https://pastebin.com/0uJ462jq
touch "file(1).txt"; ~/bin/rename.pl dry 'tr/[()]/_/' *txt
file(1).txt => file_1_.txt

~/bin/rename.pl run 'tr/[()]/_/' *txt; ls
file_1_.txt

112 :デフォルトの名無しさん:2019/12/02(月) 22:46:09.47 ID:RT0MauQR.net
find . -name '*[ ()]*' -print | sort -r | while read item; do
mv "$item" "${item%/*}/$(echo "${item##*/}" | tr ' ()' '_')"
done

113 :デフォルトの名無しさん:2019/12/03(火) 07:24:55 ID:v9g/lO5M.net
Ruby で作った。
コードは次のレスに書く

DryRun を使ったので実際には、変更されない

ファイル/ディレクトリは、同時に変更すると、バグるかも知れないので、別々に変更する。
また「子ディレクトリ(1)/孫ディレクトリ(1)」のように、2か所以上同時に変更すると、バグるかも知れない

こんな複雑なものを、シェルスクリプトで書くのは超危険!

特に移動は、dest が存在するときは移動になり、
存在しないときは変更になるという、極めて難しい場合分けが必要で、

処理の途中でエラーになると、エラーまでの処理が確定してしまうから、中途半端で巻き戻せないから、
必ず、親ディレクトリ以下のバックアップを取っておく!

114 :113:2019/12/03(火) 07:25:55 ID:v9g/lO5M.net
require 'fileutils'

root_dir = "C:/Users/Owner/Documents/Ruby/test/**/*" # 基準ディレクトリ

# 変更前のファイル/ディレクトリを入れる配列
src_files = [ ]; src_dirs = [ ]

# 基準ディレクトリ以下のファイル/ディレクトリを取り出して、配列に入れる
Dir.glob( root_dir ) do |path|
case
when File.file?( path ) then src_files.push ( path )
when File.directory?( path ) then src_dirs.push ( path )
else # 処理しない
end
end

def change_paths( src_ary ) # ファイル/ディレクトリ名を変更する
src_ary.each do |src_path|
dest_path = src_path.tr( " ()", "_" ) # 変換
next if src_path == dest_path # 変換されなかった場合は、処理しない

# 変更後の名前のファイル/ディレクトリが、既に存在すれば、エラー
msg = "変更後の名前のファイル/ディレクトリが、既に存在します!\n#{ dest_path }"
raise msg if File.exist? ( dest_path )

FileUtils::DryRun.move( src_path, dest_path )
end
end

change_paths( src_dirs )
change_paths( src_files )

115 :デフォルトの名無しさん:2019/12/03(火) 08:29:02 ID:ujGDA/f+.net
なんかかえってめんどくさいことしてんな。perlでめんどくさく書きたいだけ?

116 :デフォルトの名無しさん:2019/12/03(火) 08:29:47 ID:ujGDA/f+.net
perlではなくrubyか。しつれい

117 :113:2019/12/03(火) 09:46:02.07 ID:v9g/lO5M.net
mv を作った奴は、頭おかしいw

dest が存在するときは移動になり、
存在しないときは名前の変更になるという、極めて難しい場合分けが必要だから

漏れらが欲しいのは、
rename だけする関数と、移動するだけの関数の、2つに分かれている関数

それが分かれていないから、自分で処理を分けて、
かなりチェックしないと、バグってしまう

118 :デフォルトの名無しさん:2019/12/03(火) 12:17:58.24 ID:5ZiHQIvd.net
つまり自分に都合が悪い仕様=バグ

119 :デフォルトの名無しさん:2019/12/03(火) 12:28:33.61 ID:Uh1tIUQA.net
一括リネームってたいてい複雑になるから
GUIツールを使ったほうが良いと思うんだよね

Windows 10版のPowerToysにリネーム機能が追加
https://pc.watch.impress.co.jp/docs/news/1215602.html

120 :デフォルトの名無しさん:2019/12/03(火) 18:09:42.76 ID:+zVWCKlo.net
>>112
Fix(IFS文字が頭と末尾にある場合。dirname,basenameにしたのは気分)&Variation
find . -name '*[ ()]*' -print | sort -r | (IFS=''; while read item; do
mv "$item" "$(dirname "$item")/$(basename "$item" | tr ' ()' '_')"
done)


find . -name '*[ ()]*' -print | sort -r | (IFS=''; while read item; do
dir="$(dirname "$item")"; newname="$(basename "$item" | tr ' ()' '_')"; newpath="$dir/$newname"
[ ! -e "$newpath" ] && mv "$item" "$newpath" || echo "can't rename $item, exists $newname" >&2
done
# can't rename $item 〜 メッセージは単なる目安


find . -name '*[ ()]*' -print | sort -r | (IFS=''; while read item; do
dir="${item%/*}"; newname="$(tr ' ()' '_' <<< ${item##*/})"

[ -e "$dir/$newname" ] && {
name="${newname%.*}_"
ext="${newname#*.}"; [ "$ext" = "$newname" ] && ext='' || ext=".$ext"
while [ -e "$dir/$name$ext" ]; do
name+='_'
done
newname="$name$ext"
}

mv "$item" "$dir/$newname"
done)

121 :デフォルトの名無しさん:2019/12/03(火) 18:14:03.14 ID:+zVWCKlo.net
>>120
誤 ext="${newname#*.}"
正 ext="${newname##*.}"

122 :デフォルトの名無しさん:2019/12/03(火) 18:30:56.19 ID:HnkJN8FN.net
>>111
rename自体がperlだしちゃんと試行もあるけど

123 :デフォルトの名無しさん:2019/12/03(火) 19:27:45.48 ID:mUaHu9IR.net
>>122
perl ワンライナーより
dry run のスイッチと
どのように変更させるかに集中し
出力確認などの余計なことは共通する定型処理だから
コードにまとめたほうが使いやすい

124 :デフォルトの名無しさん:2019/12/03(火) 19:44:49.63 ID:R2wB6lmg.net
Linuxディストリによっては標準で入っている、perlスクリプトで作られたrenameコマンドのことだろ

125 :デフォルトの名無しさん:2019/12/03(火) 20:48:36.39 ID:jDo5c24e.net
renameは標準で入ってないとはいえ
テスト無しの自作コードでやるような処理じゃないやろ
find -depth -exec rename -nでdry-runしてから-n消せばいい

126 :デフォルトの名無しさん:2019/12/03(火) 21:32:10.96 ID:yTVXI633.net
話のネタから外れて何を主張したいのだか

127 :デフォルトの名無しさん:2019/12/03(火) 22:25:15.93 ID:yTVXI633.net
dry-runって言っても結局ひとつをrename/mvするその時点での状態でしか判断してないし、mvコマンドの前にecho付けるのと何が違うのだか
[ "$1" = "-n" ] && nac=echo || nac=''
$nac mv ...
でスイッチにしたけりゃ同じようにできるだろし
極めて難しいらしいことも結局時点での存在チェックしてるだけで、シェルスクリプトでtestを使うのと何がそうも極めて難しいほど違うのか

>>122
既に存在してたらエラー(オプションによって強行もできる)でもあるよね
The original C<rename> did not check for the existence of target filenames,
so had to be used with care. I hope I've fixed that (Robin Barker).
って、わざわざコメント書くようにな目玉なw
どのバージョンを使ってるのかわからんけど、パッケージによってはものすごいオプション拡張されたのが使われてるねえ

128 :113:2019/12/03(火) 23:09:51.48 ID:v9g/lO5M.net
Windows10, WSL, Ubuntu 16.04 にも、/usr/bin/rename がある

この手の処理の何がヤバイかと言うと、

例えば、3つ目の処理で、エラーが出ると、
2つ目までは、変更されてしまっているから、
そこから再実行すると、最初から実行していた時と、初期条件が変わっている

データベースと同じで、一部分だけ更新されたような、中途半端な状態になってはいけない(一貫性)。
エラー時には、すべてをロールバックするべき。
または、全体のバックアップを取っておく

すべてを更新するか、すべてをロールバックするのどちらかの状態だけにする

129 :デフォルトの名無しさん:2019/12/03(火) 23:14:22.94 ID:50yNXJCt.net
自作コードがそれ以下なのになにを言っているのだか

130 :デフォルトの名無しさん:2019/12/04(水) 00:03:09.04 ID:LOcDYH/A.net
>>108
まだ見てくれてる? 変更するんじゃなくて新たに作るほうが無難だと思うよ。
新たに作るといっても通常ファイルはハードリンクできるからね。
実際にやってみたよ。

$ find a
a
a/a (0)
a/a (0)/a (00)
a/a (0)/a (01)
a/a (1)
a/a (1)/a (11)
a/a (1)/a (10)
$ find b
b
$ cd a
$ find * -type d | perl -ne 'chop; s/[ ()]/_/g ; mkdir("../b/$_") || die("$!:$_");'
$ find * -type f | perl -ne 'chop; $old = $_; s/[ ()]/_/g ; link( $old,"../b/$_") || die("$!:$_");'
$ cd ..
$ find b
b
b/a__1_
b/a__1_/a__10_
b/a__1_/a__11_
b/a__0_
b/a__0_/a__00_
b/a__0_/a__01_
$

途中で何か起こっても起こらなくても a の方は無傷だからね。好きなだけやり直せるよ。

131 :デフォルトの名無しさん:2019/12/04(水) 02:51:13 ID:hySlbdZs.net
pax -rwlpe src dst

132 :デフォルトの名無しさん:2019/12/04(水) 23:27:09.69 ID:xn8KyTI4.net
renameコマンドって複数ないか?
's/パターン/置換文字/' FILEとパターン 置換文字 FILEとサイトによって説明違うんだよな
俺が散らばったファイルをリネームする時はmoreutilsのvidir使ってるけど
テキストエディタで修正する奴な

133 :デフォルトの名無しさん:2019/12/05(木) 00:34:07.65 ID:0uggokQM.net
Larry Wall and Robin Barker版とそれの機能拡張版のAristotle Pagaltzis版じゃね
Aristotle Pagaltzisで増えた -s パターン 置換文字 FILE 使ってじゃないの

134 :デフォルトの名無しさん:2019/12/05(木) 11:01:01.81 ID:3XJjcX6a.net
>>132
util-linux版とperl同梱版(これはさらにいくつかに分かれる)の違い
debian/ubuntu なら前者rename.ul後者rename(Larry Wall版)
centos なら前者rename後者prename(Peder Stray版)

135 :デフォルトの名無しさん:2019/12/05(木) 11:02:39.94 ID:6ZFP3Xq2.net
>>132
Debian系はPerl付属のprename、
CentOS系はutil-linuxのrename.ulをrenameとして使ってるらしい
そら人によって言ってることが違う筈だ

136 :デフォルトの名無しさん:2019/12/05(Thu) 15:05:31 ID:0uggokQM.net
Larry Wall
- Robin Barker, 重複時実行しない、 重複時実行強制実行オプション
-- Aristotle Pagaltzis, 機能いろいろ (>>132 のはそのうちの -s/--subst from to じゃないの)
- Peder Stray, 重複時バックアップオプション
Aristotle Pagaltzis意外はそんなに変わらんかな。Aristotle Pagaltzisで追加した機能を使わなければAristotle Pagaltzisも

https://github.com/tldr-pages/tldr/issues/3125
Debian prename from pkg perl: Robin Barker & Larry Wall.
Debian/Ubuntu file-rename from pkg file-rename: Larry Wall.
Arch perl-rename from pkg perl-rename: Peder Stray (same as Fedora).
Fedora prename from pkg prename: Peder Stray (same as Arch).
macOS rename from pkg rename: Aristotle Pagaltzis.

らしいけど、Larry Wall版ってあるのか?Ubuntu は Larry Wall and Robin Barker だな

137 :デフォルトの名無しさん:2019/12/05(Thu) 15:14:33 ID:TzSLtKO4.net
たぶん基本的なことだと思うんですが、教えてください。

#!/bin/bash
echo -e \
'Hostname\tIP\tInterface\tVlan\tMode\tPort-Channel\tAllowed\sVlan\tDescription'\
> cp.tsv

このスクリプトを実行すると…

$cat cp.tsv
-e Hostname IP Interface Vlan Mode Port-Channel Allowed Vlan Description

このように、先頭に-eが入ってしまいます。なぜでしょう…?

138 :デフォルトの名無しさん:2019/12/05(Thu) 15:19:51 ID:0uggokQM.net
Perl同梱(?)のprename/file-renameがLarry Wall版か
Ubuntuで pkg rename (pkg file-rename??)を入れるとprename/file-renameもLarry Wall and Robin Barker版に上書きされる感じかな??

139 :デフォルトの名無しさん:2019/12/05(木) 15:21:52.11 ID:0uggokQM.net
>>138
いや、違った
Perl同梱(?)のprename/file-renameもLarry Wall and Robin Barker版か

140 :デフォルトの名無しさん:2019/12/05(木) 15:22:44.42 ID:WdOnkWYr.net
>>137

そのスクリプトを x.sh だとして、

$ /bin/sh x.sh

とかして実行したんじゃない?

141 :デフォルトの名無しさん:2019/12/05(Thu) 15:55:06 ID:Gb1I+/8K.net
>>137
-eをオプションとして扱うかどうかはシェルによって違う。
bashはオプションだが、dashはオプションではなくただの文字列

142 :デフォルトの名無しさん:2019/12/05(Thu) 15:58:33 ID:TzSLtKO4.net
>>140-141
あ、ほんとだ。
sh -xで実行してました。
bash -xだと大丈夫でした。
シェバン付けてるから大丈夫だと思い込んでました。ダメなんですね。
横着せずにきちんと打つようにします。

ありがとうございました!

143 :デフォルトの名無しさん:2019/12/06(金) 20:34:56.63 ID:08yg4gJX.net
宇宙刑事シェバン

144 :デフォルトの名無しさん:2019/12/10(火) 22:30:09.16 ID:zD6aLrgM.net
x-y
↑こういう形式の,ハイフンで結ばれた二つの数字の計算結果の正負だけを知りたいのですが,
なるべく処理が早い方法ないですか。
対象の文字列は標準出力ではなくて変数に格納されています。

思い付いたのは
[ ${var%-*} -lt ${var#*-} ]

$((var < 0))
です。
どっちもPOSIXには準拠している筈ですが,同じような処理を大量に繰り返すとどうしても遅くなります。
これがシェルスクリプトの限界なら,仕方ないのですが,もう少し最適化できそうな気もします。
どうかお知恵とお力を貸してください。

145 :デフォルトの名無しさん:2019/12/10(火) 23:18:51.56 ID:kdXCWOtW.net
$((var < 0))はPOSIX準拠じゃなくね?

やるなら [ $(($var)) -lt 0 ] こうだろうけど
それでも遅いって言うならどうしようもないと思うが、
気になるほど遅いなら別のところに問題があるんじゃね?

146 :デフォルトの名無しさん:2019/12/10(火) 23:24:09.60 ID:kdXCWOtW.net
ちなみにうちのマシンだとこんな感じ

$ time sh -c 'var=1-2; i=0; while [ $i -lt 1000000 ]; do [ $(($var)) -lt 0 ]; i=$((i+1)); done'

real 0m2.722s
user 0m2.718s
sys 0m0.004s

100万やって3秒、1万回だと0.03秒。これが気になるとしたら
相当多くの数の計算をしてることになるはずなんだが本当に?

147 :デフォルトの名無しさん:2019/12/10(火) 23:25:16.53 ID:SL+fGedD.net
echo "$var<0"|bc

148 :デフォルトの名無しさん:2019/12/10(火) 23:28:35.11 ID:kdXCWOtW.net
bcプロセス起動してるから遅い
それは実行しなくてもわかる

149 :デフォルトの名無しさん:2019/12/10(火) 23:50:31.02 ID:kdXCWOtW.net
あとオマケ、速いとは思えないけど

IFS=-
var=1-2
set -- $var
echo $1 # 1
echo $2 # 2

これを使ってもできる。
速さは [ ${var%-*} -lt ${var#*-} ] とどっこいどっこいだろうな
もしかしたらset使ったほうが速いかもしれない程度

150 :デフォルトの名無しさん:2019/12/10(火) 23:51:59 ID:LOypIkS3.net
>>146
それ100万やったら50秒かかったわ
10万で5秒だしawk使うわ

151 :デフォルトの名無しさん:2019/12/10(火) 23:59:28 ID:kdXCWOtW.net
>>150
えらい遅いなw
俺のなんて2012年発売のCPUだぞ。
i7 3770。3.40Ghz(ブースト時で3.9Ghz)

152 :デフォルトの名無しさん:2019/12/11(水) 00:00:32 ID:ivhCTlPt.net
i7 3.4Ghzって今どき低スペックなのか?
ハイスペックかと思ってた

153 :デフォルトの名無しさん:2019/12/11(水) 00:00:55 ID:5YQOA1oq.net
>>150
awkつかうなら、awkのコード書いてみてくれ
実行してみる。

154 :デフォルトの名無しさん:2019/12/11(水) 00:03:27 ID:5YQOA1oq.net
>>152
スペックは低くはないと思うけどさ、もう古いし
中古だと2〜3万円台で搭載パソコンを買えちゃうよ
https://used.dospara.co.jp/sale/search.php?view=1&kw=Core%20i7%203770&page=1

155 :デフォルトの名無しさん:2019/12/11(水) 00:11:26 ID:ivhCTlPt.net
>>154
凄い時代になったなw
いつのまにか皆さんハッピーになってた

156 :デフォルトの名無しさん:2019/12/11(水) 00:15:38 ID:rj8eSq0k.net
バックグラウンドで色々動きっぱなし(usage 60%ぐらい)のWindows PC(Ryzen 5 2600, 3.66GHz)で

Cygwin
real 0m23.706s
user 0m23.375s
sys 0m0.093s

WSL
real 0m3.987s
user 0m3.891s
sys 0m0.016s

だった。えっ、私のCygwin遅すぎ・・・

157 :デフォルトの名無しさん:2019/12/11(水) 00:21:29 ID:5YQOA1oq.net
>>156
うちもcygwinだとそんな感じだわw msysも
WSLは全然速度変わらないのにな

本質的にCPUだけで処理できる内容のはずだが
なにかシステムコール呼び出してるんだろうな

158 :デフォルトの名無しさん:2019/12/11(水) 00:26:41 ID:H3x5MOt+.net
>>153
$ printf "%d-%d¥n" $(shuf -r -i 0-999 -n 1000000) $(shuf -r -i 0-999 -n 1000000) > input.txt
$ time awk -F "-" '{ print (($1-$2) > 0) ? "+"$0 : " "$0 }' < input.txt > output.txt

1行目は0-999でランダムな引き算を100万件生成してファイル出力
2行目の処理は50秒かかったのと同じマシンで1.7~1.8秒で終わる

計算結果をキャッシュするからか10種類くらいの引き算の使い回しだと
100万件でも0.17秒くらいになる

159 :デフォルトの名無しさん:2019/12/11(水) 00:40:07 ID:5YQOA1oq.net
>>158
円文字化けしてんぞ

$ time awk -F "-" '{ print (($1-$2) > 0) ? "+"$0 : " "$0 }' < input.txt > output.txt

real 0m0.373s
user 0m0.300s
sys 0m0.005s

$ time sh -c 'while read var; do [ $(($var)) -gt 0 ] && echo "+$var" || echo " $var"; done' < input.txt > output2.txt

real 0m8.247s
user 0m4.337s
sys 0m3.904s

まあ速いんだろうけどさ。想定の範囲内かな。

160 :デフォルトの名無しさん:2019/12/11(水) 00:40:26 ID:H3x5MOt+.net
ランダムな引き算生成するawkバージョン

$ awk 'BEGIN{srand(); for (i=0; i<1000000; ++i) {print int(rand()*1000)"-"int(rand()*1000)}}' > input.txt

161 :デフォルトの名無しさん:2019/12/11(水) 00:46:42 ID:5YQOA1oq.net
お、こっちの方がわずかに速かった。スクリプトで計算させるよりも読み込み時に分割させたほうが良いんだろうな。
setを使って分割した場合は、setの呼び出しでコストがかかると思うけど

$ time sh -c 'IFS=-; while read i j; do [ $i -gt $j ] && echo "+$i-$j" || echo " $i-$j" ; done' < input.txt > output2.txt

real 0m7.866s
user 0m4.114s
sys 0m3.744s

162 :デフォルトの名無しさん:2019/12/11(水) 00:53:02 ID:mRJcWm57.net
$ time sh -c 'var=1-2; i=0; while [ $i -lt 1000000 ]; do [ $(($var)) -lt 0 ]; i=$((i+1)); done'
real 0m2.268s
user 0m2.264s
sys 0m0.004s

$ time { var=1-2; echo "i=0;while(i<=1000000){${var}<=0;i++;}" | bc > /dev/null; }
real 0m1.540s
user 0m1.175s
sys 0m0.366s

163 :デフォルトの名無しさん:2019/12/11(水) 00:54:49 ID:5YQOA1oq.net
> 対象の文字列は標準出力ではなくて変数に格納されています。

お前らこの条件忘れてるだろw

164 :デフォルトの名無しさん:2019/12/11(水) 01:39:58.92 ID:5YQOA1oq.net
うーん、よく考えるとこれ実際の要件を想定して
「それぞれのコマンドを使って処理をした結果を元に続きの処理をする」となると
差があまりなくなってしまうかもしれん

$ time sh -c 'while read var; do echo $(($var)); done' < input.txt | while read i; do [ $i -lt 0 ]; done

real 0m7.678s
user 0m9.059s
sys 0m4.427s

$ time awk -F "-" '{ print $1-$2 }' < input.txt | while read i; do [ $i -lt 0 ]; done

real 0m7.629s
user 0m6.358s
sys 0m1.580s

$ time bc < input.txt | while read i; do [ $i -lt 0 ]; done

real 0m7.649s
user 0m6.869s
sys 0m2.006s

165 :デフォルトの名無しさん:2019/12/11(水) 01:44:25 ID:5YQOA1oq.net
$ time sh -c 'while read var; do [ $(($var)) -gt 0 ] && echo + || echo; done' < input.txt | while read i; do [ "$i" ]; done

real 0m7.596s
user 0m9.484s
sys 0m5.123s

$ time awk -F "-" '{ print (($1-$2) > 0) ? "+" : "" }' < input.txt | while read i; do [ "$i" ]; done

real 0m5.418s
user 0m4.670s
sys 0m1.012s

166 :デフォルトの名無しさん:2019/12/11(水) 01:47:25 ID:5YQOA1oq.net
結果をファイルに吐き出すだけなら良いんだけどね、
その結果をシェルスクリプトを使って処理する場合の話

167 :デフォルトの名無しさん:2019/12/11(水) 03:39:07.57 ID:MgOCMEvC.net
>>151
今年出た i5 9500
プロセッサー・ベース動作周波数 3.00 GHz
ターボ・ブースト利用時の最大周波数 4.40 GHz
あんまり変わらない気がする

シェルスクリプトなんかスレッド使わないだろうし

168 :デフォルトの名無しさん:2019/12/11(水) 07:28:04.35 ID:hRzITiR9.net
>>167
スレッドバリバリ使ってるぞw
| つかうと必然的にスレッドになるしな

169 :デフォルトの名無しさん:2019/12/11(水) 08:22:26.35 ID:6UY8oXji.net
>>145
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04
によると
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap01.html#tag_17_01_02_01
の一覧の内,sizeof()函数,++及び--単項演算子,Selection・Interation・Jumpは実装しなくてよい
とあるから>はPOSIXの範疇だと思います。

170 :デフォルトの名無しさん:2019/12/11(水) 12:44:26.62 ID:MgOCMEvC.net
>>168
そりゃプロセスだろ

171 :デフォルトの名無しさん:2019/12/11(水) 13:32:50.85 ID:hRzITiR9.net
>>170
今はCPUの話だからハイパースレッディングのスレッドだろう

172 :デフォルトの名無しさん:2019/12/11(水) 13:55:32.35 ID:hRzITiR9.net
>>169
POSIX準拠じゃないのでは?と言ってるのは
$((var < 0)) のvarは数値限定ってところだよ

173 :デフォルトの名無しさん:2019/12/11(水) 15:18:53 ID:++mq81bA.net
>>171
> | つかうと
じゃないの。普通は子プロセスだろう

174 :デフォルトの名無しさん:2019/12/11(水) 15:22:46 ID:++mq81bA.net
プロセスが別のコアで動くとかか??
スレッドをハイパースレッディングのスレッドを指すなんて初めてみた

175 :デフォルトの名無しさん:2019/12/11(水) 15:28:13 ID:hRzITiR9.net
>>173
文句は>>167に言ってくれ。合わせただけ

176 :デフォルトの名無しさん:2019/12/11(水) 15:29:58 ID:hRzITiR9.net
>>174
普通にCPUの所に4コア8スレッドって書いてあるからさ
https://kakaku.com/pc/cpu/itemlist.aspx?pdf_se=22&pdf_Spec306=4

177 :デフォルトの名無しさん:2019/12/11(水) 15:39:31 ID:++mq81bA.net
そこまで出されるとマジでスレッドという意味で使ってたんだな
OSも知らないスレッドだろう、OSから見てもただのコアだろう

178 :デフォルトの名無しさん:2019/12/11(水) 15:46:36 ID:hRzITiR9.net
>>167涙目www

でよろしいか?
俺に言うなって

179 :デフォルトの名無しさん:2019/12/11(水) 15:55:15 ID:++mq81bA.net
一行目なんて書かなきゃならないのね
>>167もそんなスレッドのことを言ってないだろうに。なんでかなw

プロセスじゃなくスレッドならプロセス起動する無駄時間がないとかそういう意味でのだろうし、そもそもスレッドはそういうために
元々のネタがプロセス起動にどれだけ食われてるのかという話だな、するなら

180 :デフォルトの名無しさん:2019/12/11(水) 16:11:12 ID:6UY8oXji.net
>>172
なるほど。確かに準拠してませんでした,すいません。

181 :デフォルトの名無しさん:2019/12/11(水) 20:23:56.94 ID:MgOCMEvC.net
>>175
いや、あってないから
勘弁してくれ

182 :デフォルトの名無しさん:2019/12/12(Thu) 01:47:04 ID:4Chv4WTd.net
>>181
シェルスクリプトでスレッドってどういう事?
スレッド使わなくてもコアは使うじゃん。

183 :デフォルトの名無しさん:2019/12/12(Thu) 02:33:13 ID:NtLqNRlV.net
>>182
なんでオレに聞くんだよ
シェルスクリプトはスレッド使わないって当然のこと言っただけじゃないか
なんで頭悪い奴が絡んでくるんだよ気持ち悪いな

184 :デフォルトの名無しさん:2019/12/12(木) 02:40:24.09 ID:n05Ewb3K.net
CPUのスペック比較とシェルスクリプトでスレッド使わないという話とどう関係あるの?
新しいCPUはOSスレッドを効率的に実行できる機能でもあるの?

185 :デフォルトの名無しさん:2019/12/12(木) 03:38:37.48 ID:g+q4RhTJ.net
そうだよな。CPUの話をしていたのに
なんでスレッド使うかどうかの話をしたのかだよな

> 今年出た i5 9500
> プロセッサー・ベース動作周波数 3.00 GHz
> ターボ・ブースト利用時の最大周波数 4.40 GHz
> あんまり変わらない気がする
>
> シェルスクリプトなんかスレッド使わないだろうし

186 :デフォルトの名無しさん:2019/12/12(木) 03:41:30.87 ID:g+q4RhTJ.net
スレッド使わなくてもコア使うから関係あるだろって言えばよかったのか?
i5 9500の名前を出したのは、コア6スレッド6だからだろ?

187 :デフォルトの名無しさん:2019/12/12(Thu) 08:10:01 ID:NtLqNRlV.net
>>184
最新のCPUにしたところで周波数がちょっと早くなった程度で差が無いって話

新しいCPUは同時実行スレッド数が増えてるとか言う奴がいるけどシェルスクリプトには関係ないだろ?
「どう関係あるの? 」とか言われても「関係ない」って最初から書いてんのに読めない訳?

188 :デフォルトの名無しさん:2019/12/12(Thu) 08:11:55 ID:NtLqNRlV.net
>>186
頭悪いなー
シェルスクリプトで使うのは1コアだけだろうが

189 :デフォルトの名無しさん:2019/12/12(木) 09:49:29.49 ID:AVYkL4QT.net
本気でシェルスクリプトとコアが関係ないと思ってるのか?
パイプ使ったら複数コア使うことになるんだが

例えばcat ファイル名 | grep なんとか ってやると
catのファイル表示と、grepが並列で動く

あとバックグラウンド実行もあるよね

自分が並列で動くものを書いてないからって、
シェルスクリプトと並列が関係ないわけじゃないだろ
自分が書かないって話をするならC言語だってコアは関係ない

190 :デフォルトの名無しさん:2019/12/12(木) 09:52:07.59 ID:AVYkL4QT.net
あと、xargsとかGNU parallelとか

191 :デフォルトの名無しさん:2019/12/12(木) 10:19:43.03 ID:mtFqZIGW.net
それはプロセスレベルの並列化のお話。スレッドの話はどこいった?

192 :デフォルトの名無しさん:2019/12/12(木) 10:24:13.74 ID:AVYkL4QT.net
シェルスクリプトで外部コマンドを使わない場合の話でもしてるのか?

シェルスクリプトでパイプを使わないならコアは関係ない!
そんな事ありえないけど関係ないんだ!
みたいな話したってしょうがないだろ


それにパイプ使うのは foo | bar | baz みたいなシェル関数でも使えるし
シェル関数の中身はそれぞれこんな感じな
while read line
do
 省略
done < ファイル名

外部コマンド一切なし

193 :デフォルトの名無しさん:2019/12/12(木) 10:24:48.46 ID:AVYkL4QT.net
>>191
今はCPUコアの話

194 :デフォルトの名無しさん:2019/12/12(木) 12:23:33.66 ID:NxSFhA/k.net
>コア6スレッド6だからだろ
それを言うならスレッド12だろ。ハイパースレッディングでスペック表すときの論理コア数をスレッドと言っているにすぎないだろうに
いつものやつが絡んでるだけだろうな、すぐに話を逸らすことからも

195 :デフォルトの名無しさん:2019/12/12(木) 12:43:03.31 ID:NxSFhA/k.net
>>183
まあ、シェル自体はスレッドを使ってることもあるだろう、いまどき
シェルスクリプトを書いてどこがスレッドとか全然わからん、どうスクリプト書けばスレッドになるのかなんて全然わからないとこではあるので、そういう意味ではスレッド使わないと言えるだろうけど

また、>>146にスレッドの効果なんて期待できないだろう。子プロセスがんがん起動しているわけでもなさそうだし、並列化なんてできそうもないスクリプトのようだからね

使ってる環境のshの実態がなんによるかが大きいんじゃないのかな?bashはかなり遅い感じかなあ

196 :デフォルトの名無しさん:2019/12/12(木) 12:57:42.86 ID:NxSFhA/k.net
>>195,183
>まあ、シェル自体はスレッドを使ってることもあるだろう、いまどき
いや、いまどきも1シェルプロセスは1スレッドしかなのか。仮にスレッド使う場合があったとしてもどういう場合というのはわからんな
確認せずにいまどきならと書いた、すまん

197 :デフォルトの名無しさん:2019/12/12(木) 16:08:19.94 ID:AVYkL4QT.net
>>194
i5 9500は6コア6スレッド
なんでこういつも思い込みで発言するかな?

URL貼れないから「インテルR Core? i5-9500 プロセッサー」からググれ

198 :デフォルトの名無しさん:2019/12/12(木) 16:10:23.64 ID:AVYkL4QT.net
>>195
OSのスレッドは使ってなくても、
CPUのコア数が多ければ、シェルスクリプトでそれを使えるから
コア数の数はシェルスクリプトでも意味があるよって話

199 :デフォルトの名無しさん:2019/12/12(木) 16:11:47.38 ID:AVYkL4QT.net
>>105
> なんでこういつも思い込みで発言するかな?
そりゃそうやろw

ただの1-2の計算なんか、どんな言語使っても
スレッドの効果なんてねーよw
言語じゃなくてやる処理の問題

200 :デフォルトの名無しさん:2019/12/12(木) 16:24:20.77 ID:AVYkL4QT.net
ちなみに>>164-165とかはパイプを使ってるのでコア数は意味がある

例えばこれだとshプロセスが2つ起動して、それぞれCPUコアを使っている
time sh -c 'while read var; do echo $(($var)); done < input.txt | while read i; do [ $i -lt 0 ]; done'

201 :デフォルトの名無しさん:2019/12/12(木) 16:41:19.05 ID:1H8k0UmA.net
自己文書化(?)されたシェルスクリプトの例
http://www.tip.net.au/wiki/index.php/Self_documenting_bash_script_options
もうちょっと洗練して、例えばhelp関数から実行するときはgettoptsコマンドを
ヘルプ出力用に書換えたものにするなんてこともできそう。

202 :デフォルトの名無しさん:2019/12/12(木) 16:43:22.79 ID:AVYkL4QT.net
>>201
それ何が嬉しいん?
ロングオプションがあればいいだけの話?

203 :デフォルトの名無しさん:2019/12/12(木) 16:49:53.62 ID:mtFqZIGW.net
$ seq 1 inf | tail

を実行して別のターミナルで

$ top -1

を実行してみる。f キーを押して fields management 画面に進んで
"Last Used Cpu" を選んで表示させる様にするとプロセスがどの
CPUコアで実行されているか表示される

204 :デフォルトの名無しさん:2019/12/12(木) 17:08:05.32 ID:1H8k0UmA.net
>>202
わざわざヘルプを別個に書かないでも
gettopts ... case ...
↑この行を解析できるようになれば
半自動的にヘルプが生成できる(のでは)ってことじゃない?

205 :デフォルトの名無しさん:2019/12/12(木) 17:46:32.53 ID:3GyD1b3F.net
>>197
ああ、ハイパースレッディングなんてないCPUか。そりゃすまん

わざわざコア6スレッド6なんて書く必要ないだろう、そのスレッドの所以たるハイパースレッディングなんてないんだから、ただのコア6だな
ハイパースレッディングがあるCPUと並列したりする場合にあった方がハイパースレッディングが無いという意味でわざわざ書くぐらいだろう

ハイパースレッディングなんて名前が悪いなw(まあ、CPU内部でやってることはスレッディングなんだろけど)

>>199言い足りなかったのねwやはりいつものか

206 :デフォルトの名無しさん:2019/12/12(木) 17:46:52.23 ID:AVYkL4QT.net
>>204
ああ、ヘルプの自動生成か。悩むところだよね。
簡単なのなら確かにそのリンク先みたいにできるだろうけど
時々例外的なコードはいるしさ、

とういうかリンク先、なんであんなよくわからんコードなんだ?
もっと簡潔にかけそうなんだが
txmp.txt? zenity?ん??GUI表示するため?

207 :デフォルトの名無しさん:2019/12/12(木) 17:48:26.91 ID:AVYkL4QT.net
>>205
コア6(ハイパースレッドなし) と書くよりも
コア6 スレッド6 の方が明確で短いだろw

208 :デフォルトの名無しさん:2019/12/12(木) 17:53:26.87 ID:AVYkL4QT.net
試しに書いてみようかと思ってコピペしようとしたら画像やしw

209 :デフォルトの名無しさん:2019/12/12(木) 18:02:50.61 ID:CkUjiG2X.net
>>207
今回のハイパースレッディングでのスレッドを言い出し絡みまくりからは、ないな

210 :デフォルトの名無しさん:2019/12/12(木) 18:16:03.44 ID:n05Ewb3K.net
>>188
>頭悪いなー
>シェルスクリプトで使うのは1コアだけだろうが
えっ?

>>195
>また、>>146にスレッドの効果なんて期待できないだろう
えっ?

話が噛み合ってなかった理由がわかってみんなスッキリだね

211 :デフォルトの名無しさん:2019/12/12(木) 18:21:26.57 ID:CkUjiG2X.net
>>210
ん?オプティマイズが仮にあったとしても並列はしないだろう、あの文では
並列にになるように書いた「別の」スクリプトとは別の話だけど?

「え?」じゃなくどうスレッドの効果があるように思うの?みんなはスッキリするかもwだが俺はもやもやもやもやするぞw

212 :デフォルトの名無しさん:2019/12/12(木) 18:22:28.30 ID:AVYkL4QT.net
>>201
やっつけ仕事w もっと正規表現頑張れば短くできそうだけど、やる気なしw

#!/bin/sh

print_opts() {
sed -nE '/\s+###START/,/\s+###END/ p' < "$1" | while read line; do
case $line in
"###"*) ;;
[0-9a-zA-Z]*)
echo -n "-${line%%)*}"
case $line in *"#"*) echo -n "${line#*#}"; esac
echo
;;
"#"*) echo " ${line#*#}" ;;
esac
done
}

while getopts "h456" optionName; do
case $optionName in
###START
h) print_opts "$0" ;;
4) ;; # negate
5) ;; # colorspace COLOR
# COLOR: RED ro GREEN or BLUE
6) ;; # sepia-tone
###END
esac
done

213 :デフォルトの名無しさん:2019/12/12(木) 18:26:08.31 ID:AVYkL4QT.net
>>211
今シェルスクリプトの話をしてるんですよ?

という言い方をしておいて、特定のシェルスクリプトコードの話になるわけないし

例えばC言語で使うのは1コアだけだろうがと言われても「は?」としか思わん。
言ったあとで「特定のC言語のコードのことだよ」って弁解してもねw

最初からシェルスクリプトで並列処理できないと思ってたのバレバレだから

214 :デフォルトの名無しさん:2019/12/12(木) 18:33:38.18 ID:CkUjiG2X.net
ああ、>>184なのかそもそもは
スレッド使ってなんか賢いことしてたら、プロセス起動する時間や並列なんぞで速くなるとか思ったのだろう、よくわからんけどw
(スレッド使えば速くなると思いがちというのはありがち)

スレッドでうまいことやっていたとしても、>>146にスレッドの効果なんて期待できないだろうということだよ。>>167のその部分の否定だよ、やんわりとしたw
で、「え?」って?


>>213
イミフ。何をいいたいのかな?C??妄想すぎるな

215 :デフォルトの名無しさん:2019/12/12(木) 18:38:11.60 ID:CkUjiG2X.net
>>213
ああ、誰かと同一人物だと思ってる??違うよ
>>167だって、>>170と言っているだろう(プロセスで並列処理だろう)、
>最初からシェルスクリプトで並列処理できないと思ってたのバレバレだから
とんちんかんな決めつけだろうなw

216 :デフォルトの名無しさん:2019/12/12(木) 18:57:21.35 ID:CkUjiG2X.net
CPU使い尽くす>>167改変版(やっつけ)
numparallels=8
time zsh -c 'var=1-2; sub () { i=0; while [ $i -lt '$((1000000 / $numparallels))' ]; do [ $(($var)) -lt 0 ]; : $((++i)); done; cat; echo "$1:$i" }; echo'"$(printf " | sub %d" $(seq $numparallels))"
まあ、やってることは何もないので分割並列しても何も問題ないが(そもそもスクリプトの目的としては問題ある)、仮にオプティマイズなんぞがあってもこんなことはしない(だろう)
現在のシェルはsubがプロセスだがスレッドを使っていたりしても、しないだろう

「え?」って何か他にスレッドの効果を出すやり方あるかなあ??スレッドを使ったとして

217 :デフォルトの名無しさん:2019/12/12(木) 19:01:40.02 ID:AVYkL4QT.net
>>215

↓こいつが馬鹿だって言ってる。

>>188
> シェルスクリプトで使うのは1コアだけだろうが

並列処理しないコードはコアを使わないと言われても
どんな言語でも当たり前としか言えない。そういう話

218 :デフォルトの名無しさん:2019/12/12(木) 19:04:56.67 ID:AVYkL4QT.net
>>214

>>167が言うには「シェルスクリプトでスレッドを使わない」(このスレッドとはハイパースレッディングのスレッドの意味)

正しい答えはシェルスクリプトでも並列処理できるし。マルチコアを使い切ることも可能。

219 :デフォルトの名無しさん:2019/12/12(木) 19:06:01.30 ID:CkUjiG2X.net
>>217,218
お前には聞いてない。最初からそう思っているおもいっきりばかにしたくてなんだろ?
そんなやつの言うことはww 変に勝手に決めつける点からも明らかに

220 :デフォルトの名無しさん:2019/12/12(木) 19:23:11.97 ID:AVYkL4QT.net
語彙がおかしくなってる(笑)

221 :デフォルトの名無しさん:2019/12/12(木) 19:24:18.99 ID:CkUjiG2X.net
こういうやつwww

222 :デフォルトの名無しさん:2019/12/12(木) 22:51:40.18 ID:1H8k0UmA.net
>>201
>>212

俺も作ってみた。
改良どころか根本的な書き直しが必要かもw
https://paste.ubuntu.com/p/wDwt8mWZrx/

223 :デフォルトの名無しさん:2019/12/13(金) 02:20:43.65 ID:ysGzQi5M.net
>>222
書いていて思ったけど、リンク先のやつ
s=$s" -negate" のsの使い方がわからんのよね
その後どう処理するか

それを入れるともっと複雑になるはずだが
それが書いてないからシンプルに見えちゃう

シェルスクリプトに限らないけど、オプション解析ライブラリはヘルプを
自動で作ろうとするけどそのヘルプを詳しく書こうとするととたんに見づらくなる気がする。
横にに長くなるんだよね。

逆の発想でPythonではヘルプを解析してオプション解析コードを生成するdocoptというものがある。
これのシェルスクリプト版でdocoptsというのもあるけど内部でgoバイナリを呼び出してて
シェルスクリプトネイティブじゃないのでちょっとダサい実装だったはず
https://github.com/docopt/docopts

こっちのほうが良い気がしてるがやっぱりヘルプにこだわりだすと、うーんって感じなので
結局、catで出力する方法で落ち着いてる。↓これね

cat<<HERE
Usage: ・・・

-a, --aaa aaaaaa
HERE

224 :デフォルトの名無しさん:2019/12/13(金) 02:37:48.49 ID:r2S5lo/C.net
HERE よりその文章全体の要約がUSAGEなので
END_USAGE とかにしたほうがちょっと読みやすい

225 :デフォルトの名無しさん:2019/12/13(金) 03:28:44 ID:ysGzQi5M.net
END_USAGEからはじまるで?

226 :デフォルトの名無しさん:2019/12/13(金) 12:27:46.56 ID:aQIhFndX.net
素人がここで訊くのはアレだがコマンドのオプションってなんでああもガバガバなの
lsは-hvlみたいにまとめられるしどこにでも指定できるじゃない
shortとlongで仕様を決めたらしいがfindからして従ってないし
ddはそもそも出自が違うらしいから異質でも納得だけども

227 :デフォルトの名無しさん:2019/12/13(金) 16:35:44.26 ID:oSsH2Kni.net
>>222
偉そうな言い方になるけど,もしあのスクリプトの
[ ${_helpcnt:-0} -ge 1 ] && \
{ optdoc 'オプションtの解説'; continue; }
という部分が
helpdoc 'オプションtの解説'
みたいに一コマンドで完結していれば使いたくなったかも。
ところが関数の中でcontinueを使うと効果なくなるのよね……w

228 :デフォルトの名無しさん:2019/12/13(金) 18:58:27.09 ID:ysGzQi5M.net
個人的にはgetoptsはロングオプションが使えないから
それだけで候補にはならんなぁ
かと言ってgetoptはロングオプション使えるけど、
数を増やすと一行がどんどん長くなってしまうw

229 :デフォルトの名無しさん:2019/12/13(金) 19:44:00.66 ID:oSsH2Kni.net
寧ろgetoptはPOSIXに準拠しなくなってしまうから嫌だな。
コマンドの主要な部分でどうしても非POSIXコマンドに頼らざる得ないとかならともかく
オプション解析っていう割と副次的な部分の機能を高めるが為にわざわざ標準から逸脱したくない。
(あんまり拘るとキリないけどw)

230 :デフォルトの名無しさん:2019/12/13(金) 19:51:43.71 ID:ysGzQi5M.net
あ、getoptが良いって言ってるわけじゃないよw

getoptはロングオプションが使えるってのは
一見良いように思えるけど、引数が長くなるから
getoptsが一文字なのは、あえてそうなってるかもなってこと

231 :デフォルトの名無しさん:2019/12/13(金) 19:55:08.60 ID:ysGzQi5M.net
あとgetoptsもgetoptもだけどさ
使うことでオプション解析って楽になってる?
使わないで独自解析してるのも見かけるけどそれと大差ないように感じる
何が嬉しくてgetoptsもgetoptを使うんだろう?

232 :デフォルトの名無しさん:2019/12/13(金) 21:32:49.16 ID:oSsH2Kni.net
そりゃ多少なりとも手間が省けるからじゃない?
たしかに結局whileやらcase文やら多用してるから大差ないように思えるけど
-abc←こういう一つのハイフンの後に複数のオプションが指定されている場合を考慮したり
オプション引数があるときはshiftする個数変えたり……
みたいなことは少なくとも俺のような頭の弱い人間には保守・管理しにくい。
経験上,getoptsが使われている場合は,
自前でオプション解析してる場合よりも常套的な構文が使われてる(もうほぼほぼwhileとcaseの入れ子)
から,gettoptsによるオプション解析の部分は読み飛ばしてもOKっていうのは気分が楽w

233 :デフォルトの名無しさん:2019/12/14(土) 11:52:21.09 ID:gTK06/8e.net
POSIX man(開発段階)の仕様書に
各企業が「よりよいヘルプ体系」(“better help system”)を付け加えることに意欲的である
っていう文章があるんだけど
このよりよいヘルプ体系について具体的に論じてるページとか知りませんか。

234 :デフォルトの名無しさん:2019/12/14(土) 12:02:40.53 ID:q2HhYeOb.net
ドキュメントはもうウェブサイトで用意したほうが良いよ

235 :デフォルトの名無しさん:2019/12/14(土) 20:55:20.00 ID:gTK06/8e.net
$ man foo
please see http://example.com/foo

ってかw
ネットワーク環境がなかったり貧弱だったりする環境は無視ですかい?

236 :デフォルトの名無しさん:2019/12/14(土) 21:20:20.57 ID:6YH7rFov.net
オフラインダウンロード機能でもあればいいだけじゃん
manの表現力は低いわけだし、いまどき画像表示できるマシンを
誰だって持ってるのに、テキストベースに拘る必要はない

開発者とかろくにメンテしないし、多言語化なんてまず無理
wikipediaのマニュアル特化型みたいにして一元管理

MDNが特定のブラウザの特定バージョンでの実装まで書いてあるのと同じように
バージョン違いもLinux版とかBSD版の違いも全部網羅したほうが良いよ。

古いバージョンのドキュメントは、新しい機能のことまで書いてないしね。
ドキュメントは分離して最新のものを常に更新していったほうが良い

237 :デフォルトの名無しさん:2019/12/14(土) 23:05:33.87 ID:gTK06/8e.net
まあ「いつのバージョンについていつ書かれたものか」みたいなのは簡単に確認できるようになるといいね。
RDFとか利用するとWebとの相性も良さそう。

238 :デフォルトの名無しさん:2019/12/15(日) 02:19:32.16 ID:a0yEED8b.net
>>237
バージョン間で違いが大きすぎるのは別として、
ドキュメント一つで全バージョンを網羅すべきだと思う
このオプションはバージョンいくつ以上から使用可能ですとか

ドキュメントにおいて存在すべきなのは最新のドキュメント一つのみ
バージョンや特定の実装に依存しない。

シェルでもdash用とかbash用とか別々に作るのは無駄だよ。
この機能はbash専用ですとか書いてあれば、一つ見るだけでよくなるし注意点もわかる
別々に作られてたら、あれこれdashで使えるんだっけ?とかなるし

239 :デフォルトの名無しさん:2019/12/15(日) 03:19:52.38 ID:woT0VW+T.net
ソフトウェア作ってるのはそんなの気にしないだろう
拡張部分で同じだがちょっと違うとは普通にあるのだし
やるのは他の誰か必要と思ったのがやるもんだろな、たとえば>>238

240 :デフォルトの名無しさん:2019/12/15(日) 04:20:02 ID:3SLEzfiL.net
>>238
昔のバージョンの動作に問題があったとしても、そこに誰が手を加えるのかって話があるのでまとめるのには無理があると思う。
いつ書いた物で、その当時の最善を尽くした、がお互い(作る方と使う方で)
許容できる最善手じゃないのか?まあつまり>>237の言ってることだがw

241 :デフォルトの名無しさん:2019/12/15(日) 04:35:07 ID:a0yEED8b.net
>>240
wikipedia方式で良いんじゃね?

242 :デフォルトの名無しさん:2019/12/15(日) 10:01:39.28 ID:E44EqLgR.net
Wikipedia方式ってのがよく分からんけど
かなり自由に編集できて,既定で最新版が表示されるけど変更履歴が辿れるっていう方式ならいいね。
↑これはwiki全般に言えることだから寧ろコマンドwikiって言ったほうが適切か。

で,Wikipediaの方針をもっと厳しくして
様式を完全に統一したり典拠や変更コメントを必須にしたりしたら
自由に編集できる利点はそのまましっかりした文書になりそう。

という訳で誰かそういうwiki作ってw

243 :デフォルトの名無しさん:2019/12/15(日) 11:36:59 ID:pTp+dpJs.net
必要性を感じた者がやるんだよ! 頑張れ!

244 :デフォルトの名無しさん:2019/12/16(月) 00:44:09.03 ID:5wUpgmce.net
日本語manだけ更新日が1990年代
英語manだけなぜかBSD版
--helpと言ってることが違う
これ食らってから正直manには期待していない
infoの日本語化って無理なのか?あっちも使いにくいが

245 :デフォルトの名無しさん:2019/12/16(月) 07:48:45.99 ID:4GuGuHT1.net
逆になぜinfoは信頼できると思ったのか

246 :デフォルトの名無しさん:2019/12/17(火) 13:48:36.21 ID:BxEORdhA.net
infoを使用すると完全なマニュアルを読むことができるはずだ。ってmanにあるくせにそれ言うのか

247 :デフォルトの名無しさん:2019/12/17(火) 22:02:31.85 ID:kdkfgKcy.net
>>244
なければ作るとよい

248 :デフォルトの名無しさん:2019/12/18(水) 18:56:56.67 ID:Cw3S1jU2.net
manはそんなに難しい英語ではない
マニュアルとしてはとてもよく書けている
これを英語で読めないんだと、そもそもマニュアルを
読み取るのが難しい国語レベルかと

249 :デフォルトの名無しさん:2019/12/18(水) 19:39:48.69 ID:uFDqtnkl.net
日本語の問題とman自身の問題は別の話でしょう?

英語圏の人がmanを使ったときの問題は
テキストベースだから使いづらい。
HTMLではないから使いづらい。
画像がないから分かりづらい。
そういった点でしょう?

日本語の問題はワークフローの問題だよ。
まず世の中英語と日本語だけじゃない無数に言語がある。
アプリの新バージョンを作ったときに翻訳してからじゃないとリリースできない
ってのは無いと思うし、翻訳だけしたらバージョンアップというのもおかしな話
(例えば--helpの内容とか)

アプリとそのマニュアルは本来別でリリースすべきなんだろう

250 :デフォルトの名無しさん:2019/12/19(木) 10:03:23.50 ID:y7Q/2NKF.net
マニュアルとプログラム本体が一緒くたにされてる今でもマニュアルの内容が古いとか
書いてることと実際の動作が違うとか問題が多発してるのに
分けようなんて言いだしたらもはや二者の乖離が酷すぎて、だれもマニュアルなんて読もうとしなくなる
……っは!もしやそれが狙いか?w

251 :デフォルトの名無しさん:2019/12/19(木) 11:24:35.20 ID:belDjs1+.net
まぁ指摘される度にお前がやれだの英語で読めだの言うけどそれ諦めてるよね
逃げ口上というか捨て台詞というか負け惜しみというか

252 :デフォルトの名無しさん:2019/12/19(木) 16:35:50.82 ID:jArWapvD.net
OSS
言い出しっぺがやるというだけだろ
指摘ってなにが目的なんだか。俺がか?

253 :デフォルトの名無しさん:2019/12/19(木) 18:30:09.45 ID:4hkxYlHE.net
bashで関数名に使える文字と使えない文字ってこれであってる?

・使える
アルファベット、ASCII文字以外 (制御文字は知らんw)
- = ~ [ ] : , . _ /
% (ジョブ機能が有効だと呼び出せない?)
数字 @ (単体はダメ)
# ^ { } (始まっているものはダメ)
+ * ?(終わるものはダメ)

・使えない
! " $ & ' ( ) \ | ` < > ; スペース

何だこのカオスwww

254 :デフォルトの名無しさん:2019/12/19(木) 18:38:08.39 ID:UoMpZOx6.net
関数名には記号を使わないのが基本だ
使っていいのは _ ぐらい
あとは紛らわしくてしょうがない
可読性が著しく下がる

255 :デフォルトの名無しさん:2019/12/21(土) 20:28:47.93 ID:X9+p8H27.net
func() {
 foo "123$@"
}

って書いて、func a b c と実行すると
foo 123a b c という呼び出しになるという仕様
奇妙だなって思ってたけど理由に気づいた

func() {
 tar "v$@"
}

func zxf file.tar.gz ってやった時
tar vzxf file.tar.gz とするために必要な仕様なんだ

はー、よくできてんなー。
シェルスクリプトってなんとなくいきあたりばったりで
作られたように見えるのによく練られた仕様だと思うよ

256 :デフォルトの名無しさん:2019/12/22(日) 11:21:06.45 ID:JDtuJK73.net
むしろそうじゃない方が例外的な動作で奇妙に見えるけど
""の内側で$@は引数に展開されるし
"str$var"←こういう引用符だったら文字列と引数はくっ付いて表示される。

257 :デフォルトの名無しさん:2019/12/22(日) 11:45:14.20 ID:JDtuJK73.net
sedでC言語中の#includeディレクティブを無効化したいんだけど
sed \
-e ':a' -e '/^#[[:blank:]]*include.*\\$/N;/\\\n/d;ta' \
-e '/^#[[:blank:]]*include.*/d'
↑これで対処できるかな。

258 :デフォルトの名無しさん:2019/12/22(日) 12:51:34.17 ID:O05uH48x.net
>>256
他の言語だったら、文字列+文字列の配列 の場合に
エラーかもしくは配列の要素が一つ増えるって考えるでしょ?
文字列の配列の一番目に、結合されるって仕様はなかなか思いつかないと思うよ

259 :デフォルトの名無しさん:2019/12/22(日) 15:12:02.64 ID:JDtuJK73.net
>>258
なるほど。

ただ、$@って配列変数じゃない気がするわ。
単に引数が空白区切りで格納されてるだけで。
↑じゃあ配列と何が違うんだと言われると難しいけどw
配列だとおこりえない挙動を示せるいい例が思い付かないので。

260 :デフォルトの名無しさん:2019/12/22(日) 15:49:52.02 ID:9GUBQyj0.net
>>257
t は s の結果に依存するのでそこで使うのは適切ではないと思われる。
sed でやるならこんな感じか。

#!/bin/sed -f
/^#[[:blank:]]*include/!b
:L0
/\\$/{N;b L0}
d

261 :デフォルトの名無しさん:2019/12/22(日) 16:03:17.69 ID:XO28QfbO.net
削除じゃなくてコメントにしちゃうとか

sed -e '/^#[[:blank:]]*include.*\\$/,/[^\\]$/s:^://:' \
-e 's:^#[[:blank:]]*include://&:'

262 :デフォルトの名無しさん:2019/12/22(日) 17:46:01.65 ID:O05uH48x.net
>>259
$1、$2でアクセスするし、その$1に空白入れる事も
できるんだから配列は配列だよ。空白区切りじゃない。

bashでは$@の名前付き版$NAME[@]は
明確に配列と言われてるしね

263 :デフォルトの名無しさん:2019/12/22(日) 18:25:06.92 ID:M+q9E136.net
>>255
必要な仕様というよりシンプルな文字列展開としてはそうなるというだけでは
その例はたまたまそういうように使えるというだけのような
あえて賢い対応してるなと言うなら "v""$@" とか書く必要がないとこかな

264 :デフォルトの名無しさん:2019/12/23(月) 15:40:09.98 ID:YJsAIsu8.net
シェル組み込みのgetoptsを同一処理内で二回以上用いるときに
$OPTIND変数を初期化してないと、前の結果が引き継がれてるせいでおかしな挙動になる

dashみたいにgetoptsを内蔵していないシェルでは
外部コマンドとしてgetopts(1)を起動した瞬間に$OPTIND変数が初期化されるみたい。
BashやらKshみたく組込みgetoptsを内蔵してるシェルの、
それも関数を跨がない処理
(getoptsを使ってる関数から一度も抜けることなく再度使用)
の時だけ$OPTIND変数が初期化されないみたいで、
そのせいで不本意な挙動の原因が掴めず半時間ほど無駄にしたw
(dashだと問題ないし、Bashでも特定の箇所でだけ不具合が生じるから)

265 :デフォルトの名無しさん:2019/12/23(月) 15:55:18.14 ID:YJsAIsu8.net
>>262
どういう要件を見たせば
ある変数が配列変数だって言えるのか知ってる?
(俺は知らん。でもプログラミング言語論とかで定義されてそう)
$@がその要件を満たしてれば配列に違いないね。

でもそういう明確な定義が無いなら
もう個人の勝手なんじゃないかな。

266 :デフォルトの名無しさん:2019/12/23(月) 16:20:51.38 ID:CGg4xw4r.net
>>264
> $OPTIND変数を初期化してないと、前の結果が引き継がれてるせいでおかしな挙動になる
当たり前だな。どこに状態を保存してるのかと

> dashみたいにgetoptsを内蔵していないシェルでは
は?内蔵してるが?おそらく初期版から。
getoptsを内蔵してないのはbusyboxで
意図的に外してビルドした場合ぐらいだろ

267 :デフォルトの名無しさん:2019/12/23(月) 16:22:45.93 ID:CGg4xw4r.net
>>264
何を言ってるのかわからんが、検証が間違ってる

268 :デフォルトの名無しさん:2019/12/23(月) 16:36:13.95 ID:YJsAIsu8.net
>>267
あ、そうなの。
じゃあdashの組み込みgetoptsが何らかの
形でBashやKshのそれと$OPTIND変数に対する処理が違うんだな。
ともあれ単純に初期化すればいいだけなんで、
事もないよ。

269 :デフォルトの名無しさん:2019/12/23(月) 16:37:34.35 ID:CGg4xw4r.net
だいたい$OPTINDはシェル変数なんだから、
getoptsは外部コマンドとして実装するのは不可能なんだよ

どうやってシェルスクリプトから実行された外部コマンドから
呼び出し元シェルスクリプトの
プロセス内のメモリを書き換えるんだよw

270 :デフォルトの名無しさん:2019/12/23(月) 16:40:45.68 ID:CGg4xw4r.net
>>268
geoptsを何回も呼び出したいなら、OPTINDを1にして初期化しろ仕様で決まってる

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/getopts.html

> If the application sets OPTIND to the value 1, a new set of parameters can be used:
> either the current positional parameters or new arg values. Any other attempt to
> invoke getopts multiple times in a single shell execution environment with
> parameters (positional parameters or arg operands) that are not the same in all invocations,
> or with an OPTIND value modified to be a value other than 1, produces unspecified results.

271 :デフォルトの名無しさん:2019/12/23(月) 16:43:06.84 ID:CGg4xw4r.net
bashやkshはローカル変数にでもなってるんだろ

272 :デフォルトの名無しさん:2019/12/23(月) 20:47:02.60 ID:sS1JWXeN.net
ぷぷぷ、ぷろぐらみんぐ言語論wwwww

273 :デフォルトの名無しさん:2019/12/23(月) 20:50:03.01 ID:YJsAIsu8.net
>>269
え、そうなん?
じゃあ
https://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html
↑getoptsはここには載ってるけれども
実質としては組み込みコマンドとして実装するしかないのか。

ありがとう!勉強になったわ。

274 :デフォルトの名無しさん:2019/12/23(月) 22:11:39.28 ID:gENEPh5i.net
>>273
そこに乗ってるのは確かに気持ち悪さがあるけどね。alias、cd、readあたりも。
まあプロセス間通信などを使えば、外部コマンドとして作るのは
絶対に不可能というわけじゃないがまずやらんだろうなw

275 :デフォルトの名無しさん:2019/12/23(月) 22:26:33.99 ID:EXKdfS/F.net
大昔は cd が外部コマンドだったと知って吃驚仰天

276 :デフォルトの名無しさん:2019/12/24(火) 11:07:35.47 ID:mQqeuoCV.net
そんなバナナ

277 :デフォルトの名無しさん:2019/12/24(火) 11:10:44.79 ID:8h2rOUkn.net
https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32549&forum=6

Cシェル(csh)上に、/usr/bin/cdと書くと、チェンジディレクトリがうまくいかず、普通にcd〜〜と書くと正しくチェンジディレクトリされます。

shellのカレントディレクトリを変更したいのなら、組み込みコマンドを使わないとダメです。

# にもかかわらず外部コマンドのcdを持っているUnixがあるのは何故だろう?
# joke ?

278 :デフォルトの名無しさん:2019/12/24(火) 11:11:40.76 ID:8h2rOUkn.net
https://tutorialmore.com/questions-292990.htm

この素晴らしい回答で参照されているように、POSIXシステムには外部バイナリ cd があります
シェル組み込みに加えて。 OS X 10.8では /usr/bin/cd です 。組み込みの cd のように
使用することはできません 独自の作業ディレクトリを変更するとすぐに終了するためです。どんな目的に役立つのですか?

解決した方法 # 1
主に、シェルの

279 :デフォルトの名無しさん:2019/12/24(火) 13:50:24.53 ID:lTGNfo7C.net
POSIXシステムには外部バイナリ cd があります
ないけど…?

280 :デフォルトの名無しさん:2019/12/24(火) 17:56:12.00 ID:O0jTO9nR.net
WSLのUbuntuにもない。

281 :デフォルトの名無しさん:2019/12/24(火) 18:31:17.89 ID:mQqeuoCV.net
というか、あったとしてどうやって使うのか?

282 :デフォルトの名無しさん:2019/12/24(火) 18:35:06.35 ID:mQqeuoCV.net
カレントディレクトリを移動してから何か実行させたいならそのcdコマンドからexecしない限りできんよな?
とするとそのcdコマンドはディレクトリだけでなく実行するコマンドを引数として受け取るのか?

283 :デフォルトの名無しさん:2019/12/24(火) 20:48:55.98 ID:uCBqTgFr.net
>>278 が出ているのに。あまり使い道がない例だけどな

284 :デフォルトの名無しさん:2019/12/24(火) 21:07:13.05 ID:uCBqTgFr.net
https://pubs.opengroup.org/onlinepubs/009695399/utilities/cd.html
APPLICATION USAGE
最初にビルトインに決まってるという説明の後で、ほぼ同じこと書いてあるやん
例が実行できるようにするには必要で、これはできないとは書いてないからあるのが仕様内だろう、たぶん
こんな使い方しねーよで無いんじゃないの、Ubuntu(Debian?)などは

285 :デフォルトの名無しさん:2019/12/25(水) 17:49:11.61 ID:DcKuxkE0.net
なるほど

286 :デフォルトの名無しさん:2019/12/25(水) 18:50:00.73 ID:N+K1pmuB.net
シェルのバックグラウンドジョブとtrapとシグナルについての理解がしたいです。
手許の環境はBashですが、コマンドライン自体はPOSIXに準じているつもりです。

{ trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }&
↑このコマンドラインを実行すると
すぐにプロンプトが帰ってきて
start
# 5秒後
end
↑などと出力されます。
一方で
{ trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }& sleep 1; kill -s QUIT $!
↑このコマンドラインを実行すると
start
# 1秒後
trapped
↑と出力されますが(少なくとも手許では)、
バックグランドジョブに回した直後のsleepを除去すると↓
{ trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }& kill -s QUIT $!
何も出力されなくなります。
最後のコマンドラインでもsleep 1を挿入した時と同じ挙動(start→#1秒後→trappedと表示)に
させるにはどうすればいいでしょうか。
どうかご教示ください。

287 :デフォルトの名無しさん:2019/12/25(水) 19:25:32.89 ID:GfHtMQ6w.net
シグナルハンドラはデフォルトの動作があらかじめ決まってる
SIGQUITだとコアダンプ吐いて強制終了かな。SIGUSR1/SIGUSR2もなんかあったな
シグナルハンドラを設定しようとするスクリプト(trap)が実行される前にはそのデフォルトのが動いてしまう
シグナルハンドラを設定するスクリプトが実行されるであろうまでsleepで待つか、設定した準備できたと知らせる(親プロセスにシグナル投げるなり)じゃないかな

onhandling=0; trap -- 'onhandling=1' USR1; { trap -- 'echo trapped; exit' QUIT; kill -USR1 $$; echo start; sleep 5& wait $!; echo end; }& while [ $onhandling -eq 0 ]; do sleep 0.1; done; kill -s QUIT $!
とか

シグナル実行抑止遅延とかあったかなあ

288 :デフォルトの名無しさん:2019/12/25(水) 19:36:59.98 ID:N+K1pmuB.net
>>287
ありがとうございます!
無事解決しました。
ところで (すでに問題は解決できたので)単なる興味本位なのですが、
trap -- 'kill -s QUIT $!' USR1; { trap -- 'echo trapped; exit' QUIT; kill -s USR1 $$; echo start; sleep 5& wait $!; echo end;
}&
↑これだと問題ありますか。
素人目線では上手くいくような気がしますが、子プロセスを殺すtrapを親プロセスの前に仕掛けてるあたりが
マズい気がします……。
(ちなみに手許では>>287様が示してくださったものと同様上手くいきました)

289 :デフォルトの名無しさん:2019/12/25(水) 19:39:42.14 ID:N+K1pmuB.net
>>288
これは取消します。
これではいかなる場合でもtrapが実行されちゃいますね。
すいませんでした。

290 :デフォルトの名無しさん:2019/12/25(水) 19:59:14.64 ID:GfHtMQ6w.net
notif=/tmp/$$.fifo; mkfifo $notif; { trap -- 'echo trapped; exit' QUIT; echo read > $notif; echo start; sleep 5& wait $!; echo end; }& read a < $notif; kill -s QUIT $!; rm $notif
通知はFIFO使って、ループが無くなってちょっとスッキリ版

291 :デフォルトの名無しさん:2019/12/25(水) 20:09:25.33 ID:v8ePSHs/.net
>>286
> { trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }& kill -s QUIT $!
> 何も出力されなくなります。

コアダンプって出力されるよな?

292 :デフォルトの名無しさん:2019/12/25(水) 21:22:56.22 ID:rkHGbRnb.net
一行で書くから見づらいったらありゃしないw
そんなごちゃごちゃやらなくても、これでいいやろ?

#!/bin/sh
sleep 1& SLEEP=$!
{
 trap -- 'echo trapped; exit' QUIT
 kill $SLEEP
 echo start
 sleep 5& wait $!
 echo end
}&
wait $SLEEP
kill -s QUIT $!

一行に戻すでー
sleep 1& SLEEP=$!; { trap -- 'echo trapped; exit' QUIT; kill $SLEEP; echo start; sleep 5& wait $!; echo end; }& wait $SLEEP; kill -s QUIT $!

293 :デフォルトの名無しさん:2019/12/25(水) 22:03:53.28 ID:N+K1pmuB.net
>>291
うーん。すいません。
恐らくシステムか何かがコアダンプを生成しないようになっているようです。
コアダンプはありませんでした。

294 :デフォルトの名無しさん:2019/12/25(水) 22:28:14.59 ID:iUDS0c82.net
ulimit -c unlimited

295 :デフォルトの名無しさん:2019/12/25(水) 22:29:25.06 ID:ixBqsT77.net
このスレにtrapでソフトタイマを作ったのが載ってるよ。

296 :デフォルトの名無しさん:2019/12/25(水) 22:40:18.77 ID:rkHGbRnb.net
>>295
もうやめたれwww

297 :デフォルトの名無しさん:2019/12/26(木) 00:40:43.87 ID:uF/G2OAQ.net
いちゃもんつけながらでないと自己表現できない自分が確認できない、いつものやつ

298 :デフォルトの名無しさん:2019/12/26(木) 00:57:23.99 ID:0kHOyMkL.net
>>297
わかるように結構工夫して書いてるんだぜw

299 :デフォルトの名無しさん:2019/12/26(木) 00:58:24.91 ID:uF/G2OAQ.net
質問主も応えてるのもわかってるけどな

300 :デフォルトの名無しさん:2019/12/26(木) 00:58:56.93 ID:0kHOyMkL.net
「俺」を否定することはできても
「レス」は否定できないやろ?w
>>292とかシンプルで美しい回答だからな

301 :デフォルトの名無しさん:2019/12/26(木) 01:01:09.61 ID:uF/G2OAQ.net
自己満wキモいわ自分で言うか
すげえな。これ以上何を言っても通じないな

302 :デフォルトの名無しさん:2019/12/26(木) 01:03:25.32 ID:0kHOyMkL.net
そうそう俺を叩いた所で無駄やで。煽り耐性レベルMAXだからな
そんなくだらないことよりレス(シェルスクリプト)の話をしようや

303 :デフォルトの名無しさん:2019/12/26(木) 10:54:33.00 ID:zbYMFUyq.net
>>292はいいな。タイムアウトまで実装できてる
>>287とか>>290だとバグで通知が行われないとフリーズしてしまうが
>>292だと一定期間でタイムアウトになって処理を継続できる

304 :デフォルトの名無しさん:2019/12/26(木) 12:41:29.91 ID:MI1/ojN2.net
>>292だとどうしても1秒間停止してしまわない?
echo trappedを(適切に)実行する準備が整い次第速やかにkill QUITしたいんじゃ
なかったっけ?
>「sleep 1を付けると(シグナルハンドラを設定するスクリプトが起動する猶予が生れて)
start→trappedが出力されるけど、sleep 1を取っ払っても作動するようにしたい」

>>287の実装が一番良いな。
シグナル受け取り側の準備が出来るまで実直に待ってるから余計な待ち時間はほぼ発生しない。
sleep <小数点>はBash拡張ってのが玉に瑕だけどもともとBash前提だから問題ない。

305 :デフォルトの名無しさん:2019/12/26(木) 12:47:29.21 ID:zbYMFUyq.net
>>304
よく読んでみて、停止しないでしょ?
必要最小限しかwaitしない

>>287だと0.1秒待つことになるが
そんなに待たないし、ループで負荷をかけることもない

306 :デフォルトの名無しさん:2019/12/26(木) 12:51:43.96 ID:zbYMFUyq.net
仮にwaitする前にsleepが(一瞬で)killされたとしても
wait ${すでにいないPID} を実行してもエラーにならないんだよね

307 :デフォルトの名無しさん:2019/12/26(木) 13:26:19.54 ID:zbYMFUyq.net
>>287>>292もQUITだとdashで想定どおりに動かないからTERMに変更したけど
timeで測りやすくスクリプトにして実行した結果はこんな感じ

$ time sh 287.sh
start
trapped

real 0m0.103s
user 0m0.001s
sys 0m0.002s


$ time sh 292.sh
start
trapped

real 0m0.002s
user 0m0.002s
sys 0m0.000s


>>287は多くの場合、最初の [ $onhandling -eq 0 ]; を満たさないのでsleep 0.1をすることになる。
なので↓のsleep 1を取っ払いたい要望に対して、sleep 0.1に変えたのと大差なくなってる。
{ trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }& sleep 1; kill -s QUIT $!

308 :デフォルトの名無しさん:2019/12/26(木) 14:16:08.46 ID:MI1/ojN2.net
>>305
あ、kill $SLEEPを読み飛ばしてたw
すまん。

309 :デフォルトの名無しさん:2019/12/26(木) 15:10:05.95 ID:W7puUhWv.net
自演w連投ぶりからいつもの

310 :デフォルトの名無しさん:2019/12/26(木) 17:04:03.21 ID:uIk/XshQ.net
自称神様の降臨か

311 :デフォルトの名無しさん:2019/12/26(木) 17:46:42.36 ID:W7puUhWv.net
ずっと居ついているだろ

312 :デフォルトの名無しさん:2019/12/26(木) 20:40:26.24 ID:VT4/hGaE.net
ただいま。ってかお前ら何やってんの?w
また俺じゃない人に絡んでるようだが

313 :デフォルトの名無しさん:2019/12/26(木) 20:57:57.00 ID:GKWkZChC.net
わざとらしすぎてわろた

314 :デフォルトの名無しさん:2019/12/26(木) 20:59:56.60 ID:VT4/hGaE.net
違うから違うって言ってるんだけどなw

315 :デフォルトの名無しさん:2019/12/26(木) 21:06:21.96 ID:GKWkZChC.net
はいはい
同じ反応速度、普通のスクリプトでわいわいなレスに対していきなりな同じ態度レスで絡む
同一人物でいいだろ。そんな辺なやつはそう居ないと思うけど

316 :デフォルトの名無しさん:2019/12/26(木) 21:08:13.76 ID:VT4/hGaE.net
意訳 俺以外はみんなあいつ

317 :デフォルトの名無しさん:2019/12/26(木) 21:08:43.19 ID:VT4/hGaE.net
俺の敵はみんなあいつ
の方が良いか

318 :デフォルトの名無しさん:2019/12/26(木) 21:12:56.47 ID:GKWkZChC.net
連投wその連投ぶりのレスの内容といい
特徴的な共通点が多すぎ

319 :デフォルトの名無しさん:2019/12/26(木) 21:35:49.17 ID:VT4/hGaE.net
>>307
俺もやってみたけどQUITじゃたしかにdashで動かないね
確かめたつもりだったけど

> sleep 0.1に変えたのと大差なくなってる。
実際のところ、この例だとsleep 0でも問題なかったりする
sleepという外部プロセスを呼び出す時間があれば、その間にtrapできてるから

と思ってkshでやったら動かんかったわw
kshではsleepはシェルビルトインなんだな

320 :デフォルトの名無しさん:2019/12/27(金) 09:20:57.82 ID:NrzsOb0y.net
横だけどQUITって使うことってある?
OSとかデバッガ系なら使うことあるだろうけど
アプリでは使わないほうが良いんじゃいかな?

321 :デフォルトの名無しさん:2019/12/27(金) 13:14:28.69 ID:GMT90LLU.net
>>320
それはなにか理由ある?

322 :デフォルトの名無しさん:2019/12/27(金) 21:58:46.84 ID:jjhZE+Ou.net
QUITってコアダンプさせるためのものでしょ?

323 :デフォルトの名無しさん:2019/12/28(土) 12:47:18.40 ID:/Zzxwqbk.net
POSIXでは基本的にTERMとほぼ同じだけど
XSI拡張では「なにか他の動作を追加的に行ってもよい」とあるな。
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html

324 :デフォルトの名無しさん:2019/12/28(土) 23:26:23.77 ID:lWCFWx/Q.net
QUITをトラップするとコアダンプ機能が使えなくなるというデメリットがあるね
普通はQUITでコアダンプするわけだから、あれ?コアダンプできない?ってなるかもしれない
コアダンプを明示的に生成する方法あるのかな?
あと、もしかしてdash、ksh、yashだとQUITってtrapできない?
trapしても何も動作しない

325 :デフォルトの名無しさん:2019/12/29(日) 01:40:48.31 ID:FmabBrht.net
dash,kshはQUITでtrapで動いてるけど。yashは試してない

326 :デフォルトの名無しさん:2019/12/29(日) 01:53:56.90 ID:MrCxy9bb.net
#!/bin/sh
trap 'echo trapped; exit' QUIT
echo $$
sleep 60


これを、sh test.sh & ってやって
表示されたプロセスIDに対してkill -q QUIT プロセスIDって
やっても何も表示されないんだけど、どうやって確認した?

327 :デフォルトの名無しさん:2019/12/29(日) 02:02:29.22 ID:FmabBrht.net
sleepというかコマンドが実行が終わるまでtrapで設定したのは動かないよ

328 :デフォルトの名無しさん:2019/12/29(日) 02:10:00.25 ID:FmabBrht.net
なんか言い方が変だな。POSIXでそのような文が書いてあったと思うそのまま書いた
コマンドが実行中はシグナル受け取っても実行されない、コマンドが終わってから実行
for i in $(seq 60); do sleep 1; done
とかで動くでしょ

329 :デフォルトの名無しさん:2019/12/29(日) 02:13:23.19 ID:MrCxy9bb.net
あれ?なんかおかしいね。
じゃあ>>287がbashだとtrappedって表示されて
shでは何も表示されないのはなぜ?

念の為、整形したやつ
#!/bin/sh
onhandling=0
trap -- 'onhandling=1' USR1
{
trap -- 'echo trapped; exit' QUIT
kill -USR1 $$
echo start
sleep 5& wait $!
echo end
}&
while [ $onhandling -eq 0 ]; do
sleep 0.1
done
kill -s QUIT $!

330 :デフォルトの名無しさん:2019/12/29(日) 02:14:47.34 ID:MrCxy9bb.net
>>328
つまりコマンド実行中はtrapしていても無視されて
強制終了してしまうってこと?

331 :デフォルトの名無しさん:2019/12/29(日) 02:17:11.43 ID:FmabBrht.net
無視ではなくて保留だな。受け取っていることは受け取っている

332 :デフォルトの名無しさん:2019/12/29(日) 02:19:29.79 ID:MrCxy9bb.net
保留だとしたらkill -s QUITした時点で終了するのはおかしいはずだが?

333 :デフォルトの名無しさん:2019/12/29(日) 02:25:16.44 ID:FmabBrht.net
>>329
shって?dashでいいの?表示されたけど
強制終了ってなにをいいたいのかわからん
dashはtrap中の標準出力にクセがあるかな?dash起動してコマンドラインでtrapでechoして、他からシグナル送っても出力されないリターンキー叩いたりしたら出る、コマンドラインではね>>329はそうならんけど

>>332
なにを言いたいのかわからん。>>326は解決したんだろ?
強制終了と思い込んで次の展開されても困るぞ

334 :デフォルトの名無しさん:2019/12/29(日) 02:31:00.58 ID:MrCxy9bb.net
>>333
全ては>>329でdashとbashで動作に違いがあるってことだよ
強制終了は強制終了。そのまんま終了してしまうってこと

335 :デフォルトの名無しさん:2019/12/29(日) 02:46:04.76 ID:FmabBrht.net
強制終了自体してなくないんじゃないの
なぜかスクリプトファイルとして実行すると、dash/kshではサブシェルのtrapが動いてないな>>329
シグナル無視なのかなんなのかendまで動き終わる

>>326はそんなんじゃなくて、単なるシンプルな間違いで、違いもなんもないけど

336 :デフォルトの名無しさん:2019/12/29(日) 03:24:42.26 ID:QzTL60WW.net
https://community.progress.com/community_groups/openedge_general/f/26/t/34654
Posted by ske on 8 Aug 2017 13:59
らしいよ。6. とか確かに
コマンドラインでの違いとかはわからんけど

337 :デフォルトの名無しさん:2019/12/31(火) 07:15:28.46 ID:xfr0s5Fj.net
PowerShell最強説

338 :デフォルトの名無しさん:2019/12/31(火) 08:44:50.09 ID:qHnQy48w.net
諸説あります

339 :デフォルトの名無しさん:2019/12/31(火) 15:40:24.49 ID:F82oxaIy.net
※個人の感想です

340 :デフォルトの名無しさん:2019/12/31(火) 23:33:05.25 ID:vVhGTaaB.net
僕もPowerShell愛用しています。
これを使い始めてから人生茨色です!

341 :デフォルトの名無しさん:2019/12/31(火) 23:43:55.86 ID:tLgKzi5A.net
人生の道が茨で埋め尽くされております!

342 :デフォルトの名無しさん:2019/12/31(火) 23:48:11.73 ID:9cUyZ2YF.net
※ 来世にご期待下さい!

343 :デフォルトの名無しさん:2020/01/01(水) 08:19:52.80 ID:6zSEt3Eo.net
>>337
使用されることが最強に少ない感

344 :デフォルトの名無しさん:2020/01/02(木) 13:42:39.95 ID:ZoBKtk8g.net
例えば/usr/local/binに

#!/bin/bash
xdg-open /usr/local/bin/hoge.html

という中身のhogeってファイル入れてコマンドで同階層のhtmlを開きたい場合、
ブラウザを閉じたら

[Parent fuga,Cecko_IOThread]
WARNING:pipe error: Connection reset by peer(piyo):
Connection reset bu peer:
file /build/firefox-esr-tpvy6K/filefox-esr-68.2.0esr/ipc/chromium/src/chrome/common/ipc_channel_posix.cc. line 358

という表示が出てくるのですがこれを表示させない方法ってありますか?

345 :デフォルトの名無しさん:2020/01/02(木) 13:59:42.22 ID:Ifo0PTAe.net
Bugzilla に登録されてるね。

Gecko_IOThread] WARNING: pipe error: Broken pipe: ... ipc_channel_posix.cc
https://bugzilla.mozilla.org/show_bug.cgi?id=1550919

346 :デフォルトの名無しさん:2020/01/02(木) 14:17:59.62 ID:ZoBKtk8g.net
>>345
つまり標準ブラウザ変えるかchromeとかにすれば良い感じですね。pipe errorとか connection reset の方で検索してました、ありがとうございますm(_ _)m

347 :デフォルトの名無しさん:2020/01/02(木) 18:23:50.86 ID:8+JZKzet.net
>>345
プログラム板の鑑みたいな人だな
凄い

348 :デフォルトの名無しさん:2020/01/10(金) 15:59:20.38 ID:pZwemz/Y.net
GNU sedって一応POSIXに準拠してるけど、色々拡張機能もあるじゃん
こういう拡張機能がほとんど無い、純粋にPOSIX標準に準じたようなsedやらawk、bcなんかの実装ってある?

349 :デフォルトの名無しさん:2020/01/10(金) 16:05:57.94 ID:c8NDboJX.net
GNU sed, GNU awk には --posix オプション、GNU bc には --standard
っていうオプションが用意されている

350 :デフォルトの名無しさん:2020/01/11(土) 08:05:41.49 ID:IVNUyUW+.net
知らんかった。ありがとう

351 :デフォルトの名無しさん:2020/01/11(土) 21:29:54.53 ID:9SPVzhvj.net
やっぱzshクソ。pathとかstatusが特殊変数なのやめてくれ。
しかも大文字と小文字区別しねーし
path=hogehogeってやったら、環境変数PATHから検索しなくなる。
command not found!

352 :デフォルトの名無しさん:2020/01/11(土) 23:34:38.48 ID:NBzz9dXo.net
単にいままでのに慣れて違いを受け入れないってだけだな

353 :デフォルトの名無しさん:2020/01/11(土) 23:39:31.73 ID:NBzz9dXo.net
なんだ、単に zsh = ksh + tcsh ってのを理解してなくて的外れな文句言っているだけじゃん
アホらしい。文字通り

354 :デフォルトの名無しさん:2020/01/12(日) 08:42:02.61 ID:QbL/hexX.net
なんでそんなに攻撃的なんだよw

355 :デフォルトの名無しさん:2020/01/12(日) 09:36:05.07 ID:FpBV3Lt5.net
>>1より
> ・csh/tcshでのシェルスクリプトは*まったく推奨しません*

>>353
> なんだ、単に zsh = ksh + tcsh ってのを
kshにまったく推奨しないものを加えたら、クソになるんじゃないですかねぇ(笑)

356 :デフォルトの名無しさん:2020/01/12(日) 09:39:05.21 ID:u1ffAIxu.net
あと、環境変数の大文字と小文字は区別されてるのに
PATHに関してだけ区別されないのはどう考えてもクソだと思いますよ

pathに代入してもPATHが変わるってどう考えても
存在理由がない機能でしょw

357 :デフォルトの名無しさん:2020/01/12(日) 11:22:16.69 ID:QbL/hexX.net
まるでwindows…

358 :デフォルトの名無しさん:2020/01/12(日) 17:34:52.15 ID:J9pO5B5T.net
そんなに不満があるなら誰かがフォークしてそれがメジャーになってるだろ
俺が正しいって言ってもお前の頭の中ではだな

359 :デフォルトの名無しさん:2020/01/12(日) 18:17:26.10 ID:QbL/hexX.net
せやな。

事実一番メジャーなシェルはBashだしね。

360 :デフォルトの名無しさん:2020/01/12(日) 18:54:12.07 ID:J9pO5B5T.net
読めない自己紹介にしかなってないな

361 :デフォルトの名無しさん:2020/01/12(日) 19:23:15.19 ID:J9pO5B5T.net
>>356
わざわざ後付けで書いてあるのに根本的に何も理解しようとしてないだけだな
大文字小文字を判断してないじゃないよ、
PATHは単なる文字列pathは配列、
pathはcsh特有での、
PATHとpathという別の2つの環境変数
shモードcshモードを切り替えてなんていう実装ではなくちゃんぽんの可能な実装なので、PATH/pathをどちらか変更したら相対する方にも同期するというのだろ。そもそもcshでのpathがそういうものらしいが
内部的に参照しているのはpathの方かな。同期されない特定状態の場合から(どういうときか探してみようw)

今まで使っていたのと違うというだけじゃ話にならない、俺が正しいって言ってもお前の頭の中ではだなでしかないということ(>>355なんてそれが甚だしいけどw)

362 :デフォルトの名無しさん:2020/01/12(日) 21:32:38.39 ID:UPYAUoGA.net
cshがーっていうけど、zshとcshに互換性はまったくないじゃん
真似しなくていいものを真似した結果、貴重な短い変数名が
使えなくなってしまったことに違いはないんだけど

363 :デフォルトの名無しさん:2020/01/12(日) 21:53:04.90 ID:J9pO5B5T.net
作りもしないのに何を文句だけ言っているのだか。そんなに俺が偉いしたいの?
This is a shar file containing zsh, a ksh/tcsh-like shell.
というコンセプトで始めてるんだよ、その成果が認められているのは有名ディストリでもパッケージとしてあるんだから明らかだろう

そんなに俺の考えたのが最強なら作ってみればいいじゃん、フォークしてでも。世界に名を轟かせるいい機会だぞ、こんな匿名で偉そうに評論してんじゃなくw

364 :デフォルトの名無しさん:2020/01/12(日) 22:07:46.46 ID:7H3TRCXg.net
zshのクソ機能をクソ機能と言っただけで
なにファビョってるんだろう?

お前が作ったわけでもないだろうに
バカにされたとでも思ってるのか?

365 :デフォルトの名無しさん:2020/01/12(日) 22:14:00.70 ID:J9pO5B5T.net
クソ機能をクソ機能と言えるほど全然賢くないのが明らかなのに、自覚のないヤツ(ら?)だなあという。自覚がないようだからでしかないんだがな

いや、そのコメでますますアレでしかないなあ。自分は何かをクソと呼ぶが、自分が同じように呼ばれると聞かないって、じゃあ、そもそもどういうつもりでクソと呼んでいるのか?哲学だよww
結局俺偉いだけもしくはただの根拠のない感情だけだから、俺が自分自身と同じだと思ってそんなコメすんだろな?としか思えんけど

366 :デフォルトの名無しさん:2020/01/12(日) 22:26:10.29 ID:7H3TRCXg.net
うわっw なんだろう、これ美味しくないって言ったら
お前は料理できるんか?みたいな反応

ただの評論家だろ、評論家は評論するな!
自分で料理しろ、自分で自分で絵をかけ、自分で歌を歌え
プロよりうまくなかったら、評価する資格なし。みたいな極端な考えw

367 :デフォルトの名無しさん:2020/01/12(日) 22:29:57.49 ID:J9pO5B5T.net
わざわざ不特定多数のとこで美味しくないという個人的感情を書く理由はなんなん
それに対して、そんなことないぞなぜなら〜と返しているのだが。なにか問題があるか?
料理調理の内容がというなら自分で作れというのはいたって当たり前だろう。不満があったら自分で調理するのがOSSだからな

結局俺偉いってだけで反論を許さない、なぜなら俺偉いからというだけかw

368 :デフォルトの名無しさん:2020/01/12(日) 22:36:44.16 ID:7H3TRCXg.net
> わざわざ不特定多数のとこで美味しくないという個人的感情を書く理由はなんなん

レビュー。Googleもやってるで

369 :デフォルトの名無しさん:2020/01/12(日) 22:39:15.15 ID:J9pO5B5T.net
ちょっと意味がわからんが、ああいうとこはやりとりはしないできないだろ
てか、ど素人かよ。スクリプトであってもまがりなりにも何か自分で作っているのに未だど素人かよと思ってしまうな、クレーマーレベルすぎてw

370 :デフォルトの名無しさん:2020/01/13(月) 05:57:08.53 ID:iUioslZh.net
そんなに気に入らないなら自分で新しいシェル作れば良いのに。

371 :デフォルトの名無しさん:2020/01/13(月) 06:56:27.50 ID:00IYKkjv.net
信者の例

新しいバトルシステムが使いづらい
→ そんなに気に入らないなら自分で新しいゲーム作れば良いのに

「設定」が使いづらい
→ そんなに気に入らないなら自分でOS作れば良いのに

372 :デフォルトの名無しさん:2020/01/13(月) 12:47:53.36 ID:cEXtDkBR.net
ナポレオン「私は卵を産めないが、卵が腐っていると判断できる」

(Zshの利用者が満足するような)シェルを作れる自信はないが、
Zshの一部機能を腐ってるとは言える。

ていうか他の人も指摘してたけど二三の欠点を指摘されただけで
まるで自分の人格を全否定されたかのような反応をするのってどういう感情なんだろう?

373 :デフォルトの名無しさん:2020/01/13(月) 15:10:18.33 ID:v+Mp6rDH.net
psコマンドで見て a.out で実行されているプロセスを全部 kill -9 してくれるスクリプトってどう書いたらいいですか

374 :デフォルトの名無しさん:2020/01/13(月) 15:12:27.51 ID:stzsvKPq.net
教えてあげないよじゃん

375 :デフォルトの名無しさん:2020/01/13(月) 15:35:35.00 ID:v+Mp6rDH.net
約に立たない2chのクズ共が自分で調べた方が早い

ps | grep "./a.out" | grep -v grep | awk '{ print "kill -9", $1}' | sh

376 :デフォルトの名無しさん:2020/01/13(月) 15:47:43.19 ID:GhUCXbF0.net
374は屑だが回答ないと豹変するのもどうかと

377 :デフォルトの名無しさん:2020/01/13(月) 16:00:10.75 ID:L1QEfUqR.net
killall でいいんじゃないかな

378 :デフォルトの名無しさん:2020/01/13(月) 16:03:48.34 ID:cEXtDkBR.net
煽って回答を貰うのはよく見掛ける光景だけど
煽りながら自己解決するのは珍しいなw

379 :デフォルトの名無しさん:2020/01/13(月) 16:56:48.83 ID:48BANHU6.net
zshはbashの強化版だと思ってたら違うのね
bashを覚えるので手一杯なんで他のシェルに浮気する余裕ないけど

380 :デフォルトの名無しさん:2020/01/13(月) 22:41:06.83 ID:ybxFvJaC.net
シェルスクリプトとしてはzshは使わないね。
bashとだいたい互換性があるシェル。
スクリプトとしてはPOSIX準拠にするかbashでしょう

381 :デフォルトの名無しさん:2020/01/13(月) 23:52:57.18 ID:HaVRjpT+.net
>>379
派生、元とした流れが全く違うからね
新しい機能つけるのに相互に参照してたり参考にしてたりするかもだが

382 :デフォルトの名無しさん:2020/01/14(火) 00:50:43.36 ID:/0srrHag.net
macでosアップデートしたらzsh強制になったんだが

383 :デフォルトの名無しさん:2020/01/14(火) 03:49:13 ID:GtH+RxOj.net
アップデートでは強制にならないよ
アップデートでなくても強制でもないし、単なるデフォ

384 :デフォルトの名無しさん:2020/01/14(火) 16:08:03.31 ID:5kcRpVJe.net
いつもの
https://i.imgur.com/Gn7TNci.jpg

385 :デフォルトの名無しさん:2020/01/14(火) 18:06:08.65 ID:Xjyusg2Z.net
>>384

>>2のリンク先にオリジナルが書いてあるから、
どこぞに転載されたものを貼り付けなくていい

386 :デフォルトの名無しさん:2020/01/14(火) 18:09:26.71 ID:Xjyusg2Z.net
この図 https://tangentsoft.com/misc/unix-shells.svg を見ると
zshはtcshを取り入れてると言うが、正確にはそれをやったのはKornShellで
その後継のksh88が、POSIX shellやbash等の現存する全てのシェルの祖先に
なるわけだから、zshと同様にdashやbashなんかもtcshを取り入れてることになるんだよな。

387 :デフォルトの名無しさん:2020/01/14(火) 18:10:25.17 ID:Xjyusg2Z.net
ksh2020でたからこの図更新してくれんかなw

388 :デフォルトの名無しさん:2020/01/14(火) 18:46:58.03 ID:3k/caRNi.net
kshってなんか凄いんだな

昔、AIXでksh書いた事あるけど
AIXぐらいでしかインストールされてる環境に出逢ったことない
Solarisでbsh書いてた後に触って配列使えて感動したのを覚えてる
また使ってみるかなぁ

389 :デフォルトの名無しさん:2020/01/14(火) 23:00:12.31 ID:eC6vK415.net
>>386
図だけで想像しすぎ
kshで取り入れたのはヒストリ機能などの極めて一部
そういろいろいうなら、ちゃんと調べた方がいいよ

390 :デフォルトの名無しさん:2020/01/14(火) 23:05:01.84 ID:eC6vK415.net
>>388
インストールというのならmacOSも昔から標準で入ってる
デフォルトログインシェルなのはAIXぐらいらしいね

391 :デフォルトの名無しさん:2020/01/15(水) 00:00:09.35 ID:kWU6CwmB.net
UNIXでbshができる
BSDでcshができる
改良版のtcshができる
bshにtcshを追加したkshができる
kshが商用だったので派生が拡がる
軽量版bshのashができる
Lnux版ashのdashができる
GNU版bshのbashができる
機能マシマシのzshができる
独立系のfishができる

こんな感じか
文字の修正とか昔のbashにはなかったらしいな

392 :デフォルトの名無しさん:2020/01/15(水) 00:15:20 ID:iV6SKP+H.net
デジャヴな適当なまとめレス

393 :デフォルトの名無しさん:2020/01/15(水) 00:24:02 ID:PiCqpD5C.net
fishは全然関係ねー
互換性がない別物

394 :デフォルトの名無しさん:2020/01/15(水) 07:03:57 ID:kWU6CwmB.net
関係ないから独立系にしたんだけど

395 :デフォルトの名無しさん:2020/01/15(水) 07:44:52 ID:YlxQUfnE.net
それ依然に単に図を適当に日本語にしただけの説明なんてしなくていいから。

396 :デフォルトの名無しさん:2020/01/16(Thu) 07:51:49 ID:kJFHtYN8.net
TETって使ってる?
OpenGroupが配布してる適合テスト

397 :デフォルトの名無しさん:2020/01/17(金) 08:13:43 ID:z4CRALQ3.net
しらん

398 :デフォルトの名無しさん:2020/01/19(日) 08:08:23 ID:q9WTUin1.net
例えば'100 50'を渡すとして、コマンドと実行結果がそれぞれ
awk '$0' #100 50
awk '$0+=1' #101
awk '$0+=$0' #200
awk '$0+=$2/2' #125
awk '$1+=$2/2' #125 50
みたいになったのですが、内側3つの挙動がよく分かりません。
予想ではそれぞれ'101 51'や'200 100'や'125 75'等になると思っていたのですが、
$0って計算式を書き込むと$1を表示する仕組みなんでしょうか…?

399 :デフォルトの名無しさん:2020/01/19(日) 09:17:02 ID:qcodQ+dh.net
$1, $2 などは、フィールド(列)変数。
$0 は、入力レコード(行)全体

こういう特別な変数に、代入してはいけない!
読み込む事だけに使うこと!

400 :デフォルトの名無しさん:2020/01/19(日) 11:47:43.00 ID:eoYSOV4S.net
それは言いすぎだろう。少なくとも gawk では何が起こるか明確になっている。
理解する気が無いならやらない方がいいというならその通りだ。

401 :デフォルトの名無しさん:2020/01/19(日) 19:39:38 ID:JpGnQ0ST.net
シェル芸の定義って、スクリプトファイル作らないで、シェル(CLI)を駆使して
実用的ではないネタを披露すること。でいいですかね?

いやあまりにもくだらないネタが多いんで

402 :デフォルトの名無しさん:2020/01/19(日) 19:41:53 ID:rMML9kO3.net
何が言いたいんだか

403 :デフォルトの名無しさん:2020/01/19(日) 19:52:31 ID:JpGnQ0ST.net
難読化シェル芸の解読
ながいPythonコードをシェル芸で実行させる
じわじわ広がる星型模様シェル芸
動く!電光掲示板シェル芸
ボディビルダーが泳ぐシェル芸
アイドルグループが46か48かわからなくなったときにワンライナーで解決する方法
鬼滅の刃の幾何学模様シェル芸
踊るgifシェル芸
ojichatグラフシェル芸
3の倍数と3が付く数字のときだけアホになるシェル芸
床屋シェル芸
闇シェル芸「さあ、闇のゲーム(シェルゲイム)の始まりだぜ!」
実践 キングウンコの作り方
画像っぽい素数をシェル芸でつくる
fish起動時にサイゼリヤ1000円ガチャの結果を表示する
【危険シェル芸】禁じられた闇の魔術とその防衛術??

404 :デフォルトの名無しさん:2020/01/19(日) 19:54:37 ID:ExWppFRM.net
>>400
POSIXでも、
The symbol $0 shall refer to the entire record; setting any other field causes the re-evaluation of $0. Assigning to $0 shall reset the values of all other fields and the NF built-in variable
と明言してるね。$1〜$nを変えれば$0が再構築され、$0を変えれば$1〜$nとNFが作り直される風に

405 :デフォルトの名無しさん:2020/01/19(日) 20:01:00 ID:ExWppFRM.net
>>403
ふむ
それがくだらなくないレスなのか。読んだ時間を返せw

406 :デフォルトの名無しさん:2020/01/20(月) 04:39:32 ID:JFurewkA.net
>>351
っPowerShell

407 :デフォルトの名無しさん:2020/01/20(月) 15:24:29.08 ID:oVJVVsJQ.net
>>399 >>404
ありがとうございます、普通に動くから大丈夫だと思ってましたm(_ _)m
とりあえず今後は素直にprintで出力します

408 :デフォルトの名無しさん:2020/01/21(火) 12:52:55 ID:m6IPx8KZ.net
kshって今時だとninjaとか使うんか…
昔ながらのMakefileじゃないんだね

409 :デフォルトの名無しさん:2020/01/21(火) 21:11:00 ID:Mn6KsPak.net
教えていただきたいことがあります。
ワンクリックで複数のターミナルを開いてそれぞれで別々のコマンドを動かすスクリプトを書きたいと思っています。
gnome-teminalにオプションつけたらいけるかと思いますしたが、うまく行かなくて、、なにかアドバイスいただけないでしょうか

410 :デフォルトの名無しさん:2020/01/22(水) 07:07:11 ID:uCiji4On.net
gnome-terminal なら -- の後に実行したいコマンドを書けばいいだけみたいだけど
動いているが挙動がイマイチとかじゃないの?
うまく行かないって、そのままTerminalとしてウィンドウを残しておきたいとか引き続きインタラクティブでなんかしたいとか?

411 :デフォルトの名無しさん:2020/01/22(水) 07:22:53 ID:uCiji4On.net
GUI Terminalアプリは一般的にコマンドが実行し終えたらアプリも終える=ウィンドウも消えるという、まあそうなるか的な(まあshもそうだし)
gnome-terminalはオプションでウィンドウを残すようにできるが、なんかイマイチかな、出るべきものが出てないとか
gnome-terminal -- sh -c 'なんかコマンド;sh'
が確実に解りやすいかなあ

shで引き続きインタラクティブにするのには、--rcfile スクリプトファイル という変態的な方法で
gnome-terminal -- sh --rcfile スクリプトファイル
とかあったが、変態すぎてしないなw

412 :デフォルトの名無しさん:2020/01/22(水) 20:17:38 ID:IMIM4EWG.net
返信ありがとうございます!
具体的にはFIFOを複数作成した後に、
ffplay (作成したfifo) というコマンドを
fifoの数だけ開きたいのですが、数が多くて一つ一つ開くのは大変なので、スクリプトで一気に開けないかと考えているところです。

413 :デフォルトの名無しさん:2020/01/22(水) 20:31:41 ID:aGAY9ZaD.net
ffplayって自分で独自のウィンドウ開くんじゃないの?
全てバックグラウンドで起動する/動かせばいいんじゃないの?
ffplayが吐くログも同時に見たいとか??

414 :デフォルトの名無しさん:2020/01/22(水) 20:38:59 ID:0dPQnm43.net
>>413
説明不足ですみません、、
そうなんです、ログも同時に複数表示させたくて

415 :デフォルトの名無しさん:2020/01/22(水) 21:18:09 ID:aGAY9ZaD.net
for i in 1 2 3 4; do
gnome-terminal -- ffplay $i.fifo
done
で、再生中はTerminalウィンドウも健在でログも見えるんじゃないの。ffplayが終了したらTerminalウィンドウは閉じてしまう
gnome-terminal -- sh -c "ffplay $i.fifo;sh"
で、Terminalウィンドウも残ると思うけど。Terminalウィンドウでffplayを終了させようとctrl-cすると、後のsh起動まで行かないけど

416 :デフォルトの名無しさん:2020/01/22(水) 21:37:15 ID:0dPQnm43.net
>>415
ありがとうございます!!
できました!
先週linux初めて触って分からないことだらけで、お手数おかけしました、、

417 :デフォルトの名無しさん:2020/01/25(土) 17:35:52.15 ID:2I6NhO3j.net
index=2,INFO1="abc",INFO2="ab,c"
↑こういう風に
「カンマ区切りで値が並んでて、区切り文字ではないカンマは引用符で囲まれてる」
みたいなデータに対して、
シェルスクリプトでINFO2やらindexやらの値を取得したいんだけどどういう方法がいいですかね。

IFSをカンマにする方法では引用符で囲まれてるカンマも区切りと見做されちゃうし…
シェルって""←の中を特別に扱う筈だから、evalとか使えば効率的に処理できそうなんだけど、
思い付かん…

418 :デフォルトの名無しさん:2020/01/25(土) 19:29:47 ID:nGGHbHoP.net
なんか前も似たような話があった気がするな
でもカンマ区切りでダブルクォートの中にカンマが含まれてるのかー
ってかCSV形式だなw

CSV関連のコマンドと連携させれば簡単に作れるけど
俺は使いたくないなー。というすると自分でパースするしか無いかなー
自分が必要なら最悪パースするけど、簡単な方法ないかなーw

419 :デフォルトの名無しさん:2020/01/25(土) 19:31:22 ID:nGGHbHoP.net
あ、IFSをカンマにしてから、evalに渡せばできるんじゃね?

420 :デフォルトの名無しさん:2020/01/25(土) 19:32:25 ID:nGGHbHoP.net
あ、evalじゃだめか。setがいるか

421 :デフォルトの名無しさん:2020/01/25(土) 19:44:38 ID:nGGHbHoP.net
setはいらんかったw
あとはスペースが入ってるときかー、どうやって対処するかな?

422 :デフォルトの名無しさん:2020/01/25(土) 20:29:47.31 ID:2I6NhO3j.net
>>418
CSV形式の一種なのかな。
ただ改行はなくて、常に一行。
あと引用符はあったりなかったりする。

具体的には、m3u8プレイリストの一部を処理したいのよね。

423 :デフォルトの名無しさん:2020/01/25(土) 20:29:55.33 ID:S3XsKqnt.net
プログラミング言語でやったことあるけど
もともとあるデータに手を加えられないなら
カンマを違う区切り文字に置き換えたかな
行解析ロジック入れたりもした

最近作ったシェルスクリプトだと
読み込むファイルをちゃんと設計して
そんなデータは行末に来るようにした
そしてwhile readで処理できるようにしてる

424 :デフォルトの名無しさん:2020/01/25(土) 20:48:15 ID:2I6NhO3j.net
超具体的に言うと(てかここまで直接に状況を晒すとクレクレみたくなるなw)

“playlist.m3u8”っていうファイルだとして

↑こういう形式の行が沢山あるんだけど、
ここのRESOLUTIONの値と対応するMOVIE-URIの値をずらずら欲しい。

IFSを変える方法だとやっぱり引用符に関係なく「,」で区切られちゃうのよね
while read l; do
IFS=','; for s in "$l"; do
echo "$s"
done
done < ./playlist.m3u8

425 :デフォルトの名無しさん:2020/01/25(土) 20:49:51 ID:2I6NhO3j.net
>>423
自分で生成するんだったら区切り文字は絶対に
他の文字と被らないようにするんだけどね……

426 :デフォルトの名無しさん:2020/01/25(土) 21:15:13 ID:nGGHbHoP.net
面倒になったー

index=2,INFO1="abc",INFO2="ab,c"

index=2 INFO1="abc" INFO2="ab c"
に変換すれば

evalできるよ!

あとは頑張ってー

427 :デフォルトの名無しさん:2020/01/25(土) 22:38:09 ID:2I6NhO3j.net
>>426
それだと引用符の中のカンマまで変換されちゃうのよね。
まあ、もう簡単に処理する方法はあきらめて
AWKやらでガシガシ解析するしかないw

428 :デフォルトの名無しさん:2020/01/25(土) 22:39:10 ID:nGGHbHoP.net
>>427
戻せばいいよー

429 :デフォルトの名無しさん:2020/01/25(土) 22:40:41 ID:nGGHbHoP.net
んー?戻すとなったらset使ったほうがいいんか?

eval set -- index=2 INFO1="abc" INFO2="ab c"

$1, $2,・・・代入されるからに処理しやすい

430 :デフォルトの名無しさん:2020/01/25(土) 22:41:54 ID:nGGHbHoP.net
> AWKやらでガシガシ解析するしかないw

シェルスクリプトでも普通にやればいいんだけどねー
一文字ずつ処理する方法さえ調べれば、
あとは簡単な普通のパーサー

431 :デフォルトの名無しさん:2020/01/25(土) 22:43:30 ID:nGGHbHoP.net
こういうのってawkで高度(?)な機能と発想の転換で使ってこなすより
1文字ずつ処理したほうが楽でわかりやすいよな

432 :デフォルトの名無しさん:2020/01/26(日) 01:20:08.20 ID:GaEtLwpN.net
GNU awk なら FPAT が使える

echo 'index=2,INFO1="abc",INFO2="ab,c"' |
gawk -vFPAT='[^=,"]+=("[^"]*"|[^,]*)' '{print gensub(FPAT, "\\1", "g")}'

=> 2,"abc","ab,c"

433 :デフォルトの名無しさん:2020/01/26(日) 01:26:07.97 ID:gf7z5zyj.net
>>432
そういうやつね、高度な機能っていうのは
大体動くんだろうけど、仕組みを把握するのがだるいんだよね
仕組みっていうかどこまで動いて、どこが動かないのかの把握

大体動く精神なんだろうけど、それ使う側がそれで
納得できる前提だから、知らない人が使う場合困るんだよな
いざ問題が起きたら、対応が逆に大変になる

434 :デフォルトの名無しさん:2020/01/26(日) 01:31:16.29 ID:GaEtLwpN.net
いやぁ、こっちからみると eval や set を使う方がツラいわ…

435 :デフォルトの名無しさん:2020/01/26(日) 01:38:47.61 ID:3NTRDHS2.net
evalやsetは普通にシェルが文法を解釈するのと
同じ動きをするだけなんだからシンプルだろ

シェルの構文パーサー自体はしっかりと作られてるんだから
でもFPATはだいたい動くという理念で作られてる

436 :デフォルトの名無しさん:2020/01/26(日) 01:48:36.68 ID:GaEtLwpN.net
FPATって単なる正規表現(ERE)でしかないけどな。個人的には正規表現で
考える方が楽でいいし確実。以前に同じ様な事があったけど、

・変数名にもカンマを使いたい(SQLみたいにバッククォートで括る)
・値の方には複数行のテキストを入れたい(newlineを使える様にして)

っていうリクエストがあって大変だったけど、結局 python の CSV パッケージ
を使って解決

437 :デフォルトの名無しさん:2020/01/26(日) 02:14:38.87 ID:3NTRDHS2.net
そもそも正規表現は単語(文字の並び)を見分けるもので
その単語の意味(このカンマはどういう意味?)を
見分けるものじゃないんだよ

本来得意ではない意味を区別できるよう拡張していったら
逆にコード見ても何をしているか意味がわからなくなってる

コードをパット見てその意味がわからんのは
スパゲッティコードと大差ないよ

438 :デフォルトの名無しさん:2020/01/26(日) 02:21:54 ID:GaEtLwpN.net
eval 使うのは面白いけど、

$ eval $(echo 'id=$(whoami),hostname=$(hostname),date="$(date)"' | tr , ' ')

fork_bomb=$(:(){ :|:& };:) なんて文字列を埋め込まれたら嫌だな…

439 :デフォルトの名無しさん:2020/01/26(日) 03:03:54 ID:GaEtLwpN.net
m3u8-file-parser(http://npm.taobao.org/package/m3u8-file-parser)なんてのがあるな
playlist のフォーマットって RFC8216 で定義されていたのね

440 :デフォルトの名無しさん:2020/01/26(日) 09:15:52 ID:EvZHCPY7.net
https://tools.ietf.org/html/rfc8216#section-4.2
属性列挙を解析したいって話か。

441 :デフォルトの名無しさん:2020/01/26(日) 11:48:02 ID:EvZHCPY7.net
>>427
AWKで解析するとして、コンマが引用符の中かそうじゃないかなんて判断できるのかな?
正規表現は>>423も言ってる通り単に文字の並びを指定するもので
ある箇所での文字の「意味」は定義できないからこういう作業には向いてなさそう。

442 :デフォルトの名無しさん:2020/01/26(日) 13:26:43.97 ID:XFNlR92Q.net
てかお前らいつまで化石みたいな話してんの?
PowerShellやれよ
お前らが大好きなLinuxにもPowerShell入れられるように成ってるからw

もうこれからはハイパーVとかWindowsサーバーとかWSLできないと食ってなるぞお前らまじで

443 :デフォルトの名無しさん:2020/01/26(日) 13:39:38.23 ID:IghF1+Kj.net
Perl ならこんな感じか。

perl -ne 'while ( /(("[^"]*"|[^,])+)/g ){ print("$1\n") }'

Perl にも CSV を扱うモジュールはあるけどね。

444 :デフォルトの名無しさん:2020/01/26(日) 13:42:52.65 ID:EvZHCPY7.net
ちょっとやろうとしてみたけど
_var='a b "a,b" c "a b"'
IFS=' '
eval set -- $_var
for s in "$@"; do
echo "$s"
done
↑これが↓
a
b
a,b
c
a b
になるのに、
_var='a,b,"a,b",c,"a b"'
IFS=','
eval set -- $_var
for s in "$@"; do
echo "$s"
done
↑これが↓
a
b
a b
c
a b
↑こうなってしまうのでevalとsetでどうにかするのはかなり難しそう。
(コンマの情報が潰されちゃう)

シェルスクリプトで自作するのに拘ってるみたいだけど
m3u8パーサ?使うべきじゃないかなぁ。

445 :デフォルトの名無しさん:2020/01/26(日) 14:11:49.86 ID:GaEtLwpN.net
>>443
Perl(PCRE)だと non-greedy matching が使えるからいいよね
とすると GNU grep ではこんな感じ

grep -Po '((".*?"|[^,])+)'

446 :デフォルトの名無しさん:2020/01/26(日) 16:19:39 ID:5vRllc8t.net
なんかハマってるなw

例えば最初がこれだとするだろ?
index=2,INFO1="a bc",INFO2="ab,c"

ダブルクォートの中にスペースが入ることがあるとして、まずスペースをありえない文字(制御文字)に変換するだろ?
index=2,INFO1="a<DEL>bc",INFO2="ab,c"

次にカンマをスペースにするだろ?
index=2 INFO1="a<DEL>bc" INFO2="ab c"

これをeval + setするだろ?
eval "set -- $DATA"

そうすると、こうなるやんか?
$1: index=2
$2: INFO1="a<DEL>bc"
$3: INFO2="ab c"

あとはループして、<DEL>をスペースに戻しつつevalすればOKだよ

文字の置換はIFS使って分割して結合
俺が悩んでたのは、実はありえない文字に変換しないで
できないかなーってところなんだよねw

>>438
そういうのは仕様。それを防ぎたかったらevalは使えないのでパースするしか無い
もしくはエスケープ+evalだけどエスケープするために結局パースが必要になる

447 :デフォルトの名無しさん:2020/01/26(日) 16:34:10 ID:GaEtLwpN.net
http://npm.taobao.org/package/m3u8-file-parser に載ってる m3u8 のサンプル
を見るとこういう行もある

#EXTINF:23.222 tvg-logo="haha, ddd" tvg-aa="sb@" tag=sa, Sample artist, : - Sample title

448 :デフォルトの名無しさん:2020/01/26(日) 17:19:14.35 ID:EvZHCPY7.net
<https://tools.ietf.org/html/rfc8216#section-4.2>によるといずれの形式の属性値も読点を含んではならないとあるのに,

例えば<https://tools.ietf.org/html/rfc8216#section-4.3.4.2>のCODEC属性値の説明には「引用符で囲まれた読点区切りの…」とある。

もしもAttributeValueの形式に全部のタグが従っていたら,上での細かい話は要らずに
IFS=','やらawk -v FS=','やらいくらでも方法はあったのにね。

ざっと見たところ,属性値であるにもかかわらず読点を含むという仕様になってるのは例にも挙げた
#EXT-X-STREAM-INF:タグのCODEC属性値のみっぽいので,もういっそそれだけを区別して処理するのもありかも。

449 :デフォルトの名無しさん:2020/01/26(日) 17:24:07.99 ID:EvZHCPY7.net
中身のない連投すまんが,
処理する相手がRFC 8216に準拠したファイルだという前提があるとするなら
タグごとに挙動を変えるほうが賢いかもしれない。
というのもどのタグにどういう文字列が現れうるかということが規格に明記されているので。

>>446 ありえない文字に置換する手法もいいとは思うけど,そういう制御文字ってたいてい
<https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap06.html#tagtcjh_4>に記述されている
非可搬な文字だから,ちゃんと運用する予定のスクリプトに入れるのは不安……。

450 :デフォルトの名無しさん:2020/01/26(日) 17:29:07.81 ID:EvZHCPY7.net
しっかし音楽・映像関連の処理をシェルスクリプトでやろうとしているとは,
そうとう変わってるなw

普通そんなファイルが存在して,かつそれらを自分で処理する=その後何らかの形で利用する
ような環境にいるんだったら,もっと色々やりやすい道具(PythonやらJavaScriptやら)もある筈よね。
シェルスクリプトで処理するしかないのは,貧弱な環境と単純なデータ構造に対してでしょうに。
(まあ>>1で「他の言語でやれ」は禁止とあるから,シェルによる処理を考えているけど)

451 :デフォルトの名無しさん:2020/01/26(日) 17:42:41.77 ID:GaEtLwpN.net
世の中には「ナントカ原理主義」を標榜する一派がいるのでな…
いや、この話題はやめておこう

452 :デフォルトの名無しさん:2020/01/26(日) 17:54:10.76 ID:5vRllc8t.net
>>449
非可搬な文字ってどういう意味?
ただの文字コードに過ぎないし、化けるわけでもなし
どんな問題があるのか全くわからんのだけど、

それにそこのテーブルに書いてある文字がダメだというのなら、
ESCAPE文字もダメってことになるじゃんか
16進数で0x1B、8進数で033、 文字に色をつけるときの\033
echo -e "\033[0;31mテキスト\033[0;39m"

理論上でもいいからどんな問題があるのかを言ってくれないと

453 :デフォルトの名無しさん:2020/01/26(日) 17:55:19.59 ID:5vRllc8t.net
非可搬な文字を心配するぐらいだったらAWKのGNU拡張に対応してるかを心配するほうがより現実的w

454 :デフォルトの名無しさん:2020/01/26(日) 18:45:22.92 ID:EvZHCPY7.net
>>452
おっしゃる通り理論上の話で実際はほぼありえない(制御文字の使い方もほぼ統一されてるから)けど,
<DEL>文字が端末それ自体を制御する為のものだった場合,それが標準出力に出力された時に
端末自体に挙動が渡ってしまう。

> 文字に色をつけるときの...
事実色をエスケープ文字によって付ける方法はシェルの標準には載ってない。

455 :デフォルトの名無しさん:2020/01/26(日) 19:38:00 ID:5vRllc8t.net
>>454
別に<DEL>じゃなくてもいいよw
略称思いつかなかっただけだし、表示されて困る文字だからこそ
テキストの中に含まれてることはないだろという理由だし

> 事実色をエスケープ文字によって付ける方法はシェルの標準には載ってない。
シェルの標準の載ってるかどうかの話じゃなくて「非可搬な文字」だから「使えない」という
理屈でいくのなら、エスケープ文字も使えないねって話

俺は「非可搬な文字」だけど「使っていけないとは書かれてない」と言ってる
だいたい非可搬っていうのは、その文字の意味が定められていないぐらいの意味やろ
バイナリで見ればただのデータなんだから

バイナリで見ればこのバイトは非可搬な文字と一致するから
データの中に使ってはいけないんだ〜みたいな話したいわけじゃないやろ?

456 :デフォルトの名無しさん:2020/01/26(日) 21:27:37 ID:EvZHCPY7.net
>>455
いや,別に<DEL>に限った話じゃない。
今回みたく
「シェルに扱ってほしくない文字を置換して一時的に退避」
→「シェルで処理」→「元に戻す」
↑こういう手法を使うにあったって必要な,
「普通の文字列には現れそうにない文字」
っていうのは大抵不可視の制御文字でしょう?(<DEL>だろうが<US>だろうが<FS>だろうが)
で,そいつら制御文字が標準出力に流れた時の挙動は未定義だから避けたほうがいいんじゃない?
という話。

繰り返すけど,これは理論上の話で,実際はほぼ起こり得ない。
けれども,
printf '\033[>c' | cat
↑こういうスクリプトが実行されたとすると,こいつはある種のOS/端末で端末情報を返すので
パイプも働かないし,おかしなことになる。
しつこいけど,こんなことが意図せず起きるなんて万に一つ。
普通は<US>やら<FS>やらを一時退避用の制御文字として利用するし,こいつらはOS/端末に対してなんら特殊な働き掛けをしないのが通例だからね。
ただ,しないとも限らないし,そうでないことが規定されておらず「非可搬」だと明記されていることも踏まえると,使わないほうがいいかなと。

457 :デフォルトの名無しさん:2020/01/26(日) 23:20:03 ID:5MGoPlaT.net
>>456
> で,そいつら制御文字が標準出力に流れた時の挙動は未定義だから避けたほうがいいんじゃない?

いやだから、そういう理屈でいくと、
「色をつけるエスケープ文字も避けたほうがいいんじゃない?」って
言ってるってことでいいんだねって聞いてるんだが

458 :デフォルトの名無しさん:2020/01/26(日) 23:27:21 ID:2jcz6vHU.net
Ruby にも、CSV モジュールがある

デフォルト設定では、
行区切り文字は、改行
列区切り文字は、カンマ
クォート文字は、"

この3つの特殊文字が、要素内にない時は、クォートしなくてよい

逆に、ある時は、クォート文字で囲む。
その際、" だけは、"" と2つにする!

459 :デフォルトの名無しさん:2020/01/27(月) 00:03:23 ID:2UZekz3a.net
>>458
話の流れが分からない馬鹿は引っ込んでろ

460 :デフォルトの名無しさん:2020/01/27(月) 00:15:59 ID:Ad8VU0Ek.net
csvパーサー使えで終わる話を
延々とやってる暇人のほうがどう考えても馬鹿だと思うぞ

461 :デフォルトの名無しさん:2020/01/27(月) 02:47:42 ID:ZRdDiNHX.net
必要なのはCSVパーサーじゃないんでしょ?

462 :デフォルトの名無しさん:2020/01/27(月) 08:20:17 ID:bYuDSUjl.net
>>457

うん。色を付けるエスケープ文字も,可搬な規格がない以上避けたほうがいい。
もちろん,ISO 1745やらに従って着色するという手もあるけど
IEEE Std 1003に準拠してる処理系がISO 1745にも準拠してるとは限らないからねぇ。

>>460
今の話はCSVの話じゃないよ,HTTP Live Streamingのファイル形式。
これはCSVの規格と違うもの。

463 :デフォルトの名無しさん:2020/01/27(月) 12:19:59 ID:3a7Xl2Zg.net
じゃあ可搬な規格がない文字を出力する
POSIX標準のtputはアウトだねw

可搬な規格がない = 使ったらダメって考えなんでしょ

なんで可搬な規格がないから使ったらダメになるのかさっぱりだw

464 :デフォルトの名無しさん:2020/01/27(月) 12:49:44 ID:YY6i47O6.net
>>463
どうやったら「避けたほうがいい。」が「使ったらダメ」になるんだ?
読んでるこっちの方のセリフだよ>さっぱりだ

465 :デフォルトの名無しさん:2020/01/27(月) 13:00:46 ID:3a7Xl2Zg.net
>>464
非可搬な文字だから,ちゃんと運用する予定のスクリプトに入れるのは不安
なんでしょ?その不安を解決するには禁止するしか無いじゃん

だいたい最初に聞いたはずだが、一体何がポータブルじゃないのかって。


ポータブルじゃないのはその文字を端末に表示した時の端末の挙動であって、
その文字を使ったときにシェルが誤動作するとかいう話ではまったくない
そもそも今回は画面に表示しないから全く関係ない。
スクリプトはどんな環境でも正しく動くのに避ける理由がない。
画面に表示した時の端末の挙動の話であることをあんたは理解してない

文字自体はポータブル(そもそもただの値でしか無い)
シェルスクリプトで使えないデータは 0x00 のみ(zshなど一部シェルでは使えるようだが)

466 :デフォルトの名無しさん:2020/01/27(月) 13:02:14 ID:3a7Xl2Zg.net
× 画面に表示した時の端末の挙動の話であることをあんたは理解してない
? 理解したふりして本質的な所が分かってない。理解が浅いから
話がつながってることが分かってない。それぞれ単独に知ってるだけ。

467 :デフォルトの名無しさん:2020/01/27(月) 13:02:45 ID:3a7Xl2Zg.net
文字化けした。ハテナではなくマル

468 :デフォルトの名無しさん:2020/01/27(月) 13:02:53 ID:bYuDSUjl.net
>>465
不安なのは俺であって>>464←こいつじゃない。

469 :デフォルトの名無しさん:2020/01/27(月) 13:04:22 ID:3a7Xl2Zg.net
知らんがなw IDなんか見てないw

470 :デフォルトの名無しさん:2020/01/27(月) 13:09:39 ID:J/l4gb9z.net
そこはちゃんと見ろよ。相変わらずオッチョコチョイな奴だw

471 :デフォルトの名無しさん:2020/01/28(火) 10:45:44 ID:kbn44J5i.net
シェルスクリプトでC言語みたく
do {...;} while ()
的な書き方できないかな。
つまり最初に条件無視して絶対一回実行されるっていう。

472 :デフォルトの名無しさん:2020/01/28(火) 11:54:17 ID:nzUBCcWX.net
while true; do
do_something
condition && break
done

473 :デフォルトの名無しさん:2020/01/28(火) 13:32:33 ID:wxWXUE5J.net
while
do_something
condition
do :; done

474 :デフォルトの名無しさん:2020/01/28(火) 16:31:01 ID:kbn44J5i.net
>>473
すげ。thx

475 :デフォルトの名無しさん:2020/01/28(火) 18:42:04.80 ID:eRWskeVd.net
do {...;} while () はいらない子

476 :474:2020/01/28(火) 20:54:08.43 ID:kbn44J5i.net
>>475
たしかにCでも>>472氏や>>473氏のような手法で
while (...) { ...; }
文で実現できるな…

477 :デフォルトの名無しさん:2020/01/28(火) 21:18:03 ID:G+y/1z2g.net
縁の下の力持ちだよ。
/usr/include で grep してみなさい。

478 :デフォルトの名無しさん:2020/01/29(水) 13:54:11.80 ID:B4xAwP+d.net
wc -mがUTF-8とかの文字列でも正しく判定できててビビった。
GNU系はともかく組み込み向けの実装では
絶対無理だと思ってBusyboxとかで試したんだけど、
全部正しい文字数を数えれてた……。

寧ろ喜ぶべきなんだけど、なんか釈然としない(foldとかがポンコツなのに)

479 :デフォルトの名無しさん:2020/01/29(水) 14:12:22.86 ID:sm4oITBd.net
逆にbusyboxは動くやろw

不安なのはBSDやで、
あれ、それなりにOKだったらそこで終わってるやん
POSIXの最低基準さえ満たせればいいって思ってる。

busyboxはPOSIX完全準拠を目指さない代わりに
「現実的な用途で動くこと」を目指してる。
UTF-8対応も現実的な要件の一つだよ

480 :デフォルトの名無しさん:2020/01/29(水) 15:20:33 ID:0dvwui3i.net
fold -w n に関しては LC_CTYPE=ja_JP.UTF-8 grep -Eo '.{1,n}' とかにするとか

481 :デフォルトの名無しさん:2020/01/29(水) 16:06:00 ID:9GJ5+8eT.net
Windows版busyboxも日本語処理なんとかしてくれないかなぁ。
cp932の処理がいまいちなのか、コマンド・プロンプトで使うlsでダメ文字のファイルが表示されないよ。

482 :デフォルトの名無しさん:2020/01/29(水) 16:13:50 ID:sm4oITBd.net
>>481
Windowsのネイティブ文字コードはUnicodeなのだから
cp932を使うのをやめればいいだけ

483 :デフォルトの名無しさん:2020/01/29(水) 16:26:53 ID:Q03p/42V.net
>>481
っ PowerShell

484 :デフォルトの名無しさん:2020/01/29(水) 20:21:31.86 ID:B4xAwP+d.net
>>480
grep優秀っすね…

485 :デフォルトの名無しさん:2020/01/29(水) 20:22:55.72 ID:UE7eyrg0.net
grepは俺が育てた

486 :デフォルトの名無しさん:2020/01/29(水) 21:24:51 ID:+kOHCQkf.net
>>482
cp65001 だと文字化けして使えない

>>483
powershell で busybox ls とやっても同じくダメ文字が表示されない

最新のバイナリ(busybox-w64-FRP-3329-gcf0fa4d13.exe)でもだめ

487 :デフォルトの名無しさん:2020/01/30(Thu) 22:29:51 ID:uJZNpkau.net
なんで対処方法お母さんに聞かなかったの?

自分で対応できると思ったの 

488 :デフォルトの名無しさん:2020/01/31(金) 07:54:20 ID:aEgzRTpo.net
シェルスクリプトでaliasを使うことでしか実現できない挙動ってある?
コマンドを別に定義する方法って主に3通りくらいある
関数: somecmd() { ... }
別名: alias somecmd=...
変数 : somecmd=...
と思うんだけど、この内aliasに独特の特長ってあるのかな。

489 :デフォルトの名無しさん:2020/01/31(金) 09:38:38 ID:fxx+hpXO.net
>>478
UTF-8は上位ビットを見れば文字の先頭か途中かまた何バイトなのか等がわかるので変換しなくても文字数はわかる(詳しくはWikipedia等を参照)。

そんな小技使って作られているかどうかはわからないが。

490 :デフォルトの名無しさん:2020/01/31(金) 10:37:58 ID:XoEdclD3.net
>>488
alias loop="while true; do"

loop echo aaa; done

491 :デフォルトの名無しさん:2020/01/31(金) 10:41:13 ID:XoEdclD3.net
alias IF=if
alias THEN=then
alias ENDIF=fi

IF [ a = a ]; THEN
 echo aaa
ENDIF

492 :デフォルトの名無しさん:2020/01/31(金) 11:40:54 ID:aEgzRTpo.net
>>490
一応変数使ってもいけね?

loop='while true; do'

eval "$loop echo aaa; sleep 0.1; done"

てかeval使えばなんでもありだから,
evalを使わずにって条件だと,挙げてくれた例みたいなことが
実現できるのかな。

493 :デフォルトの名無しさん:2020/01/31(金) 11:42:09 ID:XoEdclD3.net
× 一応変数使ってもいけね?
○ eval使ってもいけね?

だろ

494 :デフォルトの名無しさん:2020/01/31(金) 11:42:25 ID:XoEdclD3.net
そして、evalを使わないと実現できない

495 :デフォルトの名無しさん:2020/01/31(金) 14:09:19.88 ID:y3M2GGQ2.net
>>492
loop() { while true; do "$@"; done }
f() { echo aaa; sleep 0.1; }
loop f

496 :デフォルトの名無しさん:2020/01/31(金) 15:35:28 ID:aEgzRTpo.net
>>495
関数でもいけんじゃん

497 :デフォルトの名無しさん:2020/01/31(金) 19:02:07.40 ID:drX8qvaW.net
>>496
趣旨を理解してないなら黙ってて

498 :デフォルトの名無しさん:2020/01/31(金) 19:33:30.56 ID:dOfy+zuH.net
shebangにさ、#!/bin/sh -eu って書いたらちゃんと動くのに、
#!/bin/sh -e -u って書いたら動かない
オプションは一つしか受け付けない?
これってどこに仕様ありますか?

499 :デフォルトの名無しさん:2020/01/31(金) 19:37:01 ID:dOfy+zuH.net
一つしか受け付けないと言うか

#!/bin/sh -e -u
って書いたら

/bin/sh "-e -u"
って解釈されるのか
全体が一つの引数

500 :デフォルトの名無しさん:2020/01/31(金) 20:39:38.35 ID:NEnVm4zd.net
実はshebangの決まった仕様はないからOS依存

501 :デフォルトの名無しさん:2020/01/31(金) 21:40:42.29 ID:O7+QvGXX.net
>>500
仕様上はOS依存として、
実際にこれ以外の挙動をする場合ってあるの?

502 :デフォルトの名無しさん:2020/01/31(金) 21:53:14.63 ID:ppIZAX+V.net
>>488
\ でalias をキャンセルできる機能
関数とか変数では、例えば ls を定義したときに
簡単にキャンセルできない。alias なら

$ \ls

で一発O.K.

503 :デフォルトの名無しさん:2020/01/31(金) 22:07:06 ID:EhZkCGRB.net
この前会見したマスごみが感染元で

504 :デフォルトの名無しさん:2020/01/31(金) 22:09:28 ID:MHZeJgmL.net
>>502
command なら alias も function も OK

$ command ls

505 :デフォルトの名無しさん:2020/01/31(金) 22:17:23.02 ID:NEnVm4zd.net
>>501
a) 1つ目のスペースの前がコマンド名、その後はスペースも含めて1つの引数 (Linux等)
b) 1つ目のスペースの前がコマンド名、その後はスペース区切りの複数の引数 (昔のBSDやOSX等)
c) スペースも含めて全部コマンド名 (実在するか不明)
d) shebang非対応 (昔はあったがほぼ絶滅)

あとは、最大長とかにも注意

506 :デフォルトの名無しさん:2020/01/31(金) 22:38:43 ID:O7+QvGXX.net
macは違うのかよ。相変わらず独自文化だな。

507 :デフォルトの名無しさん:2020/01/31(金) 23:54:24.78 ID:9zbnwalP.net
>>505
#!の次は本来スペースだって知ってた?

508 :デフォルトの名無しさん:2020/02/01(土) 00:09:21 ID:4wtj5811.net
>>478
Windows10, WSL, Ubuntu 18.04 では、
中国の「深圳」みたいな、サロゲートペアも、1文字になる!

echo -n '深圳' | wc -m
2

509 :デフォルトの名無しさん:2020/02/01(土) 01:59:55 ID:Kd/XXZch.net
>>507
https://www.in-ulm.de/~mascheck/various/shebang/#blankrequired
によるとその話が正しい証拠はない模様

510 :デフォルトの名無しさん:2020/02/01(土) 02:50:01 ID:SC0qANHR.net
>>507
逆にスペースを入れてはいけないというふうに教わったけど、
入れたからといって動かないというのはないな。

511 :デフォルトの名無しさん:2020/02/01(土) 18:54:16 ID:izL/3CDz.net
>>510
オライリーのシェルスクリプトの本には
一部のBSD系OSで#! の後にスペースが要るみたいなこと書いてあった。
でも、これは又聞きで全部試した訳じゃないけど
そんな挙動のBSD実装はなくて、
実はGNUプロジェクトのソースコードに誰かが勘違いして書き込んだコメントが元らしい。

512 :デフォルトの名無しさん:2020/02/01(土) 19:00:18 ID:S6J9WFvX.net
>>505
> b) 1つ目のスペースの前がコマンド名、その後はスペース区切りの複数の引数 (昔のBSDやOSX等)

macOSが今もこれなんだな。複数の実装があるのはめんどくさいな

513 :デフォルトの名無しさん:2020/02/01(土) 19:16:51 ID:rbhAio8f.net
>>512
ソースチラ見した限りでは元々は a) ぽい。# の後ろはコメントとして切り捨ててるみたいだが
FreeBSDをガシガシ取り入れた時にFreeBSDが b) だからに変えたぽいかな。その後FreeBSDが a) に変わったが追従せずな

514 :デフォルトの名無しさん:2020/02/01(土) 19:25:08 ID:rbhAio8f.net
>>513
># の後ろはコメントとして切り捨ててるみたいだが
元々はこれもなく、まんま a) 。その後に #の後ろ切り捨て。その後 b) だった

515 :デフォルトの名無しさん:2020/02/01(土) 19:29:08 ID:7bhnkH1k.net
macOSでshebangにダブルクォートが入っていた場合どうなるんだろうなぁ
すぐそこにマシンあるから調べればわかるけどさw

516 :デフォルトの名無しさん:2020/02/01(土) 19:56:33.67 ID:rbhAio8f.net
一番古い10.0から公開されてる最新の10.4までで、そこでダブルクォート文字は現れない、'\n'、'#'、' '、'\t' ぐらいしか文字としてナニかを判断してない
単なる文字だね。そのまま引数としての単なる文字として

517 :デフォルトの名無しさん:2020/02/01(土) 20:38:02.21 ID:7bhnkH1k.net
日本語が不自由だぞw

518 :デフォルトの名無しさん:2020/02/01(土) 20:50:05.02 ID:izL/3CDz.net
shebangは悪い文化

519 :デフォルトの名無しさん:2020/02/01(土) 20:54:33.24 ID:7bhnkH1k.net
shebangよりも拡張子の方が良かったのかな?

520 :デフォルトの名無しさん:2020/02/01(土) 20:57:55 ID:rbhAio8f.net
なんか説明しようとしたんだがな
ダブルクォートが入っていても関係ないよ。なぜかは調べてね

521 :デフォルトの名無しさん:2020/02/01(土) 20:59:45 ID:rbhAio8f.net
>>518
悪い文化というより、POSIXで規定しろというだけかな
悪い文化のががっつりカーネルで実装されてるんだけど

522 :デフォルトの名無しさん:2020/02/01(土) 21:13:13.94 ID:izL/3CDz.net
>>521
単なる表現だから気にしないでほしいけど
悪い←実装ごとに挙動がバラバラ・標準仕様が規定を諦めている
文化←にもかかわらずほとんどの実装がこれを取り入れていて、利用者もしょうがなく使っている
という状況を言ったつもりだった。

523 :デフォルトの名無しさん:2020/02/01(土) 21:19:14.91 ID:rbhAio8f.net
>>522
なるほど
まあ、誰も(大多数が)困ってないんじゃなのかな、統一されてなくても
もしくはそれぞれがそれぞれが良いと思って譲らないとかかwそれは確かに悪い文化だな
誰も困ってないって方だと思うけど

524 :デフォルトの名無しさん:2020/02/01(土) 21:48:34 ID:7bhnkH1k.net
shebangが悪い所の一つは絶対パス指定ってところなんだよね
content-typeみたいなのだったら良かったのに

shebangのオプションに関しては使わないっていうのが正解なんだと思う
なぜならファイルを直接指定して実行すると変わっちゃうから

525 :デフォルトの名無しさん:2020/02/02(日) 14:26:51.03 ID:xQhhTPSe.net
てかshebang使わなくてもシェルから起動したらそのまま動かない?

と思って、念の為Bashから起動したらまさかのaliasが効かなかった……。

こういうのを避ける為に#!/bin/shとせざる得ないのか。残念。

526 :デフォルトの名無しさん:2020/02/02(日) 16:53:40 ID:XLs1Cb+c.net
>>524
絶対パスかどうかは、シェルというか、インタープリタに依存するんじゃないの?
Pythonなんかだと、パスさえ通っていれば、#!python とか #!python3 で使い分けできるし。

527 :デフォルトの名無しさん:2020/02/02(日) 17:45:00 ID:Cva1xhgA.net
>>526
(少なくとも現在は)shebangを解釈しているのはOSであって、絶対パス必須
#!pythonと書いたスクリプトをexecveした場合、普通は動かない

528 :デフォルトの名無しさん:2020/02/03(月) 06:12:52 ID:UlsnX0ii.net
みんな
#!/bin/env python
じゃないの?
環境変数使ってくれるよ

529 :デフォルトの名無しさん:2020/02/03(月) 08:04:03 ID:24GdBe+7.net
envがあるところは/usr/bin/envな

あとそれ使うと

#!/usr/bin/env bash -e

とかできなくなるからな
Linuxで

530 :デフォルトの名無しさん:2020/02/03(月) 09:05:47 ID:gnFHl5C0.net
>>529
/bin/envの環境と/usr/bin/envの環境がある

531 :デフォルトの名無しさん:2020/02/03(月) 10:00:30 ID:24GdBe+7.net
>>530
envってコマンドを使うと、環境の違いを吸収してくれるから便利だぞ

532 :デフォルトの名無しさん:2020/02/03(月) 11:22:27 ID:8ufJ91gq.net
>envがあるところは/usr/bin/env
に対しての
/bin/envにある環境もあるって話だろ。「それってなに?」だろ言うなら

533 :デフォルトの名無しさん:2020/02/03(月) 11:28:54 ID:sGoeeXwW.net
>>531
そのenvコマンドとやらのパスが環境ごとに違うんだよなぁ…。

534 :デフォルトの名無しさん:2020/02/03(月) 11:40:34.98 ID:8ufJ91gq.net
KCディフェンス覚醒したか?するか?

535 :デフォルトの名無しさん:2020/02/03(月) 11:41:11 ID:8ufJ91gq.net
やったな、KCディフェンスっ

536 :デフォルトの名無しさん:2020/02/03(月) 11:41:39 ID:YoBHNt10.net
Mac の香具師は、env をよく使う

537 :デフォルトの名無しさん:2020/02/03(月) 11:41:40 ID:8ufJ91gq.net
すまん、誤爆もいいとこ。ちょっと興奮してたw

538 :デフォルトの名無しさん:2020/02/03(月) 11:57:54.57 ID:MUEM5Vrv.net
env env env ...

539 :デフォルトの名無しさん:2020/02/03(月) 12:09:00.93 ID:sGoeeXwW.net
なんかこの前々スレあたりで標準出力と標準エラー出力に別々の処理を施した上で
どちらも標準出力に流す方法を見た覚えがあるんだけど
今それっぽい語句で検索しても引っ掛からない。

覚えてる人いない?

540 :デフォルトの名無しさん:2020/02/03(月) 12:58:07.85 ID:24GdBe+7.net
>>539
もっと前だったと思うが

まあこれとかだな
https://stackoverflow.com/questions/9112979/pipe-stdout-and-stderr-to-two-different-processes-in-shell-script

応用でこれとかな
https://unix.stackexchange.com/questions/14270/get-exit-status-of-process-thats-piped-to-another/14272#70675

541 :417:2020/02/04(火) 21:40:22 ID:M0ahQJ78.net
>>446
ありがとうございます。
コードを参考にさせていただいて、
sed -e 's/\("[^"]*"\)*,\("[^"]*"\)*/\1 \2/g'
という手法にしました。

今のところ
<<. cat |
aa,"dd,dd","aa,bb",cc,"ab c"
.
sed -e 's/\("[^"]*"\)*,\("[^"]*"\)*/\1 \2/g'
がうまいこといくので満足してます。
どうもお手数おかけしました。

542 :デフォルトの名無しさん:2020/02/04(火) 22:00:02 ID:zwthX76y.net
case $value in
 ここ)
esac

ここって何ていうの?globじゃないよね?

543 :デフォルトの名無しさん:2020/02/04(火) 22:01:37 ID:/eeo/zhy.net
bash(1) だと pattern って書いてある

544 :デフォルトの名無しさん:2020/02/04(火) 22:11:53 ID:zwthX76y.net
パターンかぁ。汎用的すぎるなぁ。

545 :デフォルトの名無しさん:2020/02/05(水) 07:03:40 ID:TkSDhbEE.net
(unofficial) Bash Strict Modeって知ってる?
http://redsymbol.net/articles/unofficial-bash-strict-mode/

これが何って話があるわけじゃないんだけど有名なのかな?と思って
外国だとそれなりに情報出てくるけど日本はあまり見つからない

名前が知られてないだけでsetで-eu -o pipefailしましょうというのは聞くけどね
ただIFS=$'\n\t'は知らなかったな。これやったほうがいいんかな?
スペースが削られてるから問題起きそうだけど

546 :デフォルトの名無しさん:2020/02/05(水) 08:00:23 ID:ER23be8Q.net
>>545
IFS=$'\n\t'
↑これはどういう事態を防げるの?
寧ろ
for file in *; do
echo $file
done
こういうのが動かんくなる気がするけど。

547 :デフォルトの名無しさん:2020/02/05(水) 08:25:41 ID:TkSDhbEE.net
>>546
それは変数使ってるわけじゃないから問題なく動くよ

548 :デフォルトの名無しさん:2020/02/07(金) 21:49:29 ID:fFz2F73L.net
https://github.com/bashup/mdsh
↑おもしろい。シェルも使える文芸的プログラミング

549 :デフォルトの名無しさん:2020/02/07(金) 22:25:08.40 ID:LLO+pCZY.net
めんどくさいので3行にまとめてくれ

550 :デフォルトの名無しさん:2020/02/07(金) 22:46:56 ID:LLO+pCZY.net
なるほど。文芸的プログラミングという
ドキュメントを書くときにコードを埋め込んで
(動作確認のために?)実行できるようにするための
マークアップ言語みたいなものがあるんだな
コードの中にコメントを埋め込むのとは逆の発想か

551 :デフォルトの名無しさん:2020/02/07(金) 22:58:24 ID:YkBBCjCg.net
bashのsourceって英語としては意味なんだろう?
includeとかimportだったら読み込むってわかるけど、
なんでsourceって単語にしたんだろうか

552 :デフォルトの名無しさん:2020/02/08(土) 00:06:22.51 ID:Ld8bPHII.net
なんのことかと思ったらMarkdown文書をソースとするshellがありますぞというだけかという感じ

553 :デフォルトの名無しさん:2020/02/08(土) 08:03:47 ID:EnngxFza.net
なんでそんなに偉そうなんだよw

554 :デフォルトの名無しさん:2020/02/08(土) 12:05:42 ID:vyHTTWz1.net
>>551
元々は設定ファイルを読み込む

$ source .bashrc

あたりで使っていたようなので、「基にする」あたりが
英語の意味かと思う

555 :デフォルトの名無しさん:2020/02/08(土) 14:06:09 ID:EnngxFza.net
今から考えるとimportコマンドとかの方がいいね。

556 :デフォルトの名無しさん:2020/02/08(土) 14:51:42 ID:0wE1WgKD.net
importは他のファイル等で定義済みの関数やクラスを今の名前空間に持ってくるイメージ
sourceは他のファイルに書いてるコードを実行するイメージ
言語によってはやってること同じだったりするけど主たる目的が違う気がする

557 :デフォルトの名無しさん:2020/02/08(土) 15:15:58 ID:rR7NyU2B.net
だな

558 :デフォルトの名無しさん:2020/02/08(土) 15:41:05 ID:WgESEu8I.net
> sourceは他のファイルに書いてるコードを実行するイメージ
動作としてはそうなんだけど、
気になってるのは英単語としてどうかなんだよね
変なことを気にしてると思うけど

そもそもsourceって動詞?ああ、動詞としての意味もあるのか?
https://talking-english.net/source/
> sourceは動詞でも使い方があり「仕入れる」といった意味になりますが、
>
> 例文
> We source our coffee beans from Venezuela.
> 私たちはコーヒー豆をベネズエラから仕入れている。

559 :デフォルトの名無しさん:2020/02/08(土) 22:01:26 ID:EnngxFza.net
importに名前空間を移動する印象があるのは同意だけど
sourceの「他のファイルに書いてるコードを実行する」ような印象はないな。
つーかsourceってシェル以外でみかけない。
名前空間とか高級な概念を無視する、単なる対象ファイルの実行・読み込みは
includeが一番「それっぽい」な。
C言語みたいなコンパイル方式でもm4・Xresourceみたいなインタプリタ・設定ファイル形式でも。

560 :デフォルトの名無しさん:2020/02/08(土) 23:17:01.30 ID:WgESEu8I.net
sourceの本来の名前が . だとして、
/etc/profileとかに . /etc/bash.bashrc とか書いてあるでしょ?

これは関数定義等を読み込んでると言うより、
ただそこにあるスクリプトを実行してるという感じがしない?

561 :デフォルトの名無しさん:2020/02/08(土) 23:17:36.95 ID:WgESEu8I.net
そもそもなんで . (ドット)だったのかっていう疑問もあるけどw

562 :デフォルトの名無しさん:2020/02/09(日) 07:56:47 ID:u8D56ofC.net
>>560
ああ、いや、たしかにそうなんだけど、
sourceっていう名前の(または.(ドット)って名前の)コマンドや指令が
シェルスクリプト以外で見掛けないなと思ってさ。
じゃあシェルスクリプト以外の言語でsourceに最も近いはたらきをするのは
なにかって言えば、includeかなぁ。と。

563 :デフォルトの名無しさん:2020/02/09(日) 08:09:38.60 ID:WtBEbY+3.net
includeで言えばC言語かなぁ
でもC言語のincludeはヘッダファイルの読み込みで
(今のC++はそうとは言えないが)
実行するものはなにもないものだったよね

.やsourceを他の言語で見たことがないのは同意
なんでこの単語を選んだのか。まあ当時はそういうことをするときの
標準的な単語はなく、includeやimportの方がたまたま有名になったってだけな気もするけど

includeってC/C++以外あったっけ?

564 :デフォルトの名無しさん:2020/02/09(日) 08:12:52 ID:WtBEbY+3.net
include, import, load, require, source
他に何があるかな?

565 :デフォルトの名無しさん:2020/02/09(日) 08:15:45 ID:WtBEbY+3.net
とういうか、その話をするためにきたんじゃなかったw

makeってどういう亜種があるの?
それぞれのOSでどこまで互換性があるの?
どこかにそういう情報まとまってないかな

566 :デフォルトの名無しさん:2020/02/09(日) 08:19:42 ID:WtBEbY+3.net
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html
ここにPOSIXに関しては書いてあるけど、現実としてはどこまで互換性があるのかなと
つまり便利ないろんな機能(?が使いたいけど、ここには書いて無いようで
使っていいものなのかわからない

567 :デフォルトの名無しさん:2020/02/09(日) 08:26:03 ID:WtBEbY+3.net
オライリーのGNU Make、無料で公開されてたヽ(=´▽`=)ノ
https://www.yokoweb.net/2016/08/28/gnu-make-3rd-pdf-github/

568 :デフォルトの名無しさん:2020/02/09(日) 08:40:31 ID:WtBEbY+3.net
Makeについて調べていたら上のシバンの話、!の後にスペース入れれっていうのが見つかったでw

https://web.sfc.wide.ad.jp/~sagawa/gnujdoc/autoconf-2.59/autoconf-ja_10.html
> また,以 下のように,インタプリタ仕様として,感嘆符の後にスペースを含めてください.
>
> #! /usr/bin/perl

569 :デフォルトの名無しさん:2020/02/09(日) 08:41:08 ID:WtBEbY+3.net
ここまでコピペするべきだった

> パスの前のスペースを省略する場合,(DYNIXのような)4.2BSDを基本 とするシステムは,
> `#! /'は4バイトのマジックナンバーとして解釈される ので,その行を無視します.
> 古いシステムでは,`#!'行の長さにも小さな 制限があり,例えばSunOS 4では,(改行を含めず)32バイトになります.

570 :デフォルトの名無しさん:2020/02/09(日) 09:07:13 ID:nPaz0f5T.net
>>563
VBScript

571 :デフォルトの名無しさん:2020/02/09(日) 10:20:28 ID:gml78nRc.net
>>569
それ間違っている
https://www.in-ulm.de/~mascheck/various/shebang/#blankrequired

>You may also read, that (allegedly) such a kernel parses "#! /" as a 32-bit (long) magic.
>4.2BSD in fact doesn't require it, although previous versions of the GNU autoconf tutorial wrongly claimed this ("10. Portable Shell Programming", corrected with release 2.64, 2009-07-26).
>But instead, see 4.2BSD, /usr/src/sys/sys/kern_exec.c (the first regular occurence). A blank is accepted but not required.

572 :デフォルトの名無しさん:2020/02/09(日) 12:28:36 ID:mw6BsSoR.net
pgrepには検索文字数の制限があるのか?

573 :デフォルトの名無しさん:2020/02/09(日) 12:29:59 ID:3rHefPWY.net
そんなのあるのか? pgr

574 :デフォルトの名無しさん:2020/02/09(日) 13:26:52 ID:u8D56ofC.net
>>572
どこ情報?

575 :デフォルトの名無しさん:2020/02/09(日) 14:04:29.38 ID:Fnglc4p2.net
>>563
あなたはC言語がUNIXを作るために作られた言語だと知らないの?

576 :デフォルトの名無しさん:2020/02/09(日) 14:07:08 ID:Fnglc4p2.net
>>569
そもそもどのUNIX、Linuxの話をしているのか?

577 :デフォルトの名無しさん:2020/02/09(日) 14:20:04 ID:QqkdphAP.net
>>575
それがどう話につながるのか説明してくれ

578 :デフォルトの名無しさん:2020/02/09(日) 14:57:41 ID:RDxzsaY4.net
shellはUNIX上でのいちプログラム、UNIXはCで作られてる。shellだってCで(途中から?)作られていただろう。故に、
>当時はそういうことをするときの標準的な単語はなく、includeやimportの方がたまたま有名になった
ということはなく、同じならinclude使うんじゃねってとこかな?なんか違うから違うのにしたという方が読みやすいかなあ

shell scriptはPrologの構文が元じゃなかったっけ。ちょっとググったとこでは、
:-
か。なんかこれに似てるといえば似てるな . は

579 :デフォルトの名無しさん:2020/02/09(日) 15:11:26 ID:Fnglc4p2.net
>>577
先に存在しているC言語とは別の考えで設計されている。カリフォルニア大学のバークレー校の複数人が考えたものだから、統一感がないのは仕方ない。

580 :デフォルトの名無しさん:2020/02/09(日) 15:48:09 ID:mPwdKOvO.net
>>572
linuxならlinux自体にプロセス名の長さ制限(16文字)があるからそうなる
コマンドライン自体はlinuxも十分長い文字列を扱えるから、-fを使えばよい

581 :デフォルトの名無しさん:2020/02/09(日) 16:48:41 ID:RDxzsaY4.net
>>578
>shell scriptはPrologの構文が元じゃなかったっけ
違った。ALGOLだな。ALGOLでそれっぽいのはUSINGみたいだが、ちょっと違うなあ

582 :デフォルトの名無しさん:2020/02/09(日) 16:50:22 ID:u8D56ofC.net
for a in XXX; do
somecmd...
done
↑ここのXXXの大きさについて、SUSやらで文書化された制限ってある?
もしあるとすればどう調べればいいかな。

XXXは引数じゃないからARG_MAXとかじゃないし、
もしかしたら実質無制限?(システムのメモリに依存とか?)

583 :デフォルトの名無しさん:2020/02/09(日) 19:33:12 ID:wmQivLfL.net
ksh 2020がでたのは知ってるけどkshに一体何が起きてるんです?
20年以上の開発がゴミクズとして消えるんですか?

Rewinding this repo and encouraging community
https://github.com/att/ast/issues/1466

584 :デフォルトの名無しさん:2020/02/10(月) 00:06:22.74 ID:jvWR6fCp.net
https://github.com/att/ast/tree/ksh2020

This branch is not supported
This branch contains the ksh2020 version of the AST tools, from January 2020,
which primarily written and maintained by @krader1961 and @siteshwar.

This branch is not supported or maintained by AT&T; the repo at
https://github.com/att/ast only officially hosts ksh93u+ and the experimental ksh93v- branch.

See #1464 and #1466 for discussion and history of this decision.

Please search for forks of this repo if you are looking for ksh2020.

585 :デフォルトの名無しさん:2020/02/10(月) 00:08:02.47 ID:jvWR6fCp.net
https://github.com/att/ast/issues/1466

私はAT&T Labs Research で@lkoutsofiosと協力し、コミュニティが
快適な状態にレポを復元できるかどうかを確認するためにボランティアで参加しました。これは最後に#1464で議論されました。

私はkshや技術的な問題の専門家ではなく、歴史全体を知りませんが、私の理解は

1. ksh93u +は、AT&Tからの最終的な公式リリースです。これはブランチ2012-08-01-masterにあります

2. 後のバージョンであるksh93v-は、AT&Tを離れた後に元の作者によって提供されましたが、
このバージョンは安定しているとは見なされません。これはタグksh93vで見つけることができます

3. @ krader1961はmasterブランチを数年間維持しています。彼はコードベースを合理化しようとしました
(そしてastの残りではなくkshのみをサポートしました)が、これは互換性の問題を引き起こしました。
kshの元の作者はすべてAT&Tを去りました。社内にはまだ多くのユーザーがいますが、
プロジェクトを維持および管理できるユーザーはいません。

586 :デフォルトの名無しさん:2020/02/10(月) 00:11:44.63 ID:jvWR6fCp.net
私の提案は:

・ 現在のマスターをブランチ「ksh2020」(または適切なもの)に移動します。
・そのブランチのREADME.mdおよびCHANGELOG.mdをメンテナンスされていないものとして
明確にマークします。#1464をポイントし、詳細についてはこの問題を参照してください。
・ マスターブランチを2012-08-01-masterにリセットします
・リポジトリから外部の共同編集者を削除します。AT&Tの誰もこれを維持していないので、
このフォークをアクティブなものにすることは意味がありません。GitとGithubを使用すると、
誰でも自分のスペースで好きな方向にコードを取得できます。

587 :デフォルトの名無しさん:2020/02/10(月) 00:12:00.37 ID:jvWR6fCp.net
・ README.mdをクリーンアップして、現在の状態を反映します。「このレポには、ASTの
AT&T ksh93u +および試験的なksh93v-バージョンが含まれます。ASTおよびkshのフォークは
後である可能性があります。」
・ CONTRIBUTING.mdを変更し、テンプレートを明確にして、このフォークを
積極的に維持しておらず、何も確認しないことを約束します。
・リポジトリの説明を「AST-AT&T Software Technology」に短縮します(#1441)

これが完了したら、AT&Tでmasterブランチのksh93u +にパッチを提供する可能性があります。
些細なこと(ビルドの問題など)でない限り、貢献を確認したり受け入れたりすることはおそらくないでしょう。
最終的には、このリポジトリをアーカイブします。

現在、会社の誰もがkshのためだけにレポを作成するつもりはないと思います。
しかし、これはかなり簡単で、コミュニティが取り上げることができると思います。

588 :デフォルトの名無しさん:2020/02/10(月) 00:27:01.24 ID:jvWR6fCp.net
こういうこと?

1. AST-AT&T Software Technologyはkshだけのプロジェクトではない。kshはASTプロジェクトの一部
2. 誰かがkshだけをメンテナンスしていた。ASTプロジェクト全体をメンテナンスしてる人はいない
3. 今リリースされてるksh 2020はそれ
4. ksh 2020 は後方互換性がなく古いスクリプトが動かなくなっていた
5. それは困るのでmasterを2012-08-01-masterにリセットしてアーカイブする
6. AT&Tはこのリポジトリをメンテナンスしない。 誰か開発したいのなら、ksh2020ブランチから続きをやれ
7. ksh2020ブランチにはもうメンテナンスしてないって書いてあるからそれ消してから勝手に続きをやれ

589 :デフォルトの名無しさん:2020/02/10(月) 08:02:14.12 ID:RPv+4ALj.net
Google翻訳使うなとは言わないけど,わざわざそれをスレに載せるな。
せめて自分で訳したものならともかく,なんの情報でもない。

590 :デフォルトの名無しさん:2020/02/10(月) 08:09:49.99 ID:jvWR6fCp.net
え?翻訳すらしないでコピペすることだってあるじゃん
そういうのを引用っていうんだよ。
引用したらだめってこと?意味がわからないなぁ

591 :デフォルトの名無しさん:2020/02/10(月) 11:18:22 ID:RPv+4ALj.net
>>590
飛躍しすぎ。
スレと関係ないただの忠告になるからこれ以上言わんが、
引用するななんて一言も言ってないし,ただの引用のほうがよほどマシ。
ていうかGoogle翻訳したものを貼り付けて「引用」って……

あなたはGoogle翻訳(機械翻訳全般)を信じてるのかも知れないけれども,
2020年現在,これらの翻訳の質は,あなたが貼り付けた文章を見ても分かる通り,酷いもの。
半分「嘘っぱち」の文章が出てると言っても過言じゃない。
特に,機械翻訳の中でも,minhonやlibtr8nとは違って,Google翻訳は2018年ころから
「学習した英語・日本語訳文からそれっぽい文字の並びを引っ張ってくる」っていう手法を取るようになったから
「見てくれは他の機械翻訳より?自然?だけど内容が全くデタラメ」っていう最悪の事態を生み出すようになってしまった。
幸か不幸か,あなたが貼り付けた文章にそこまで酷い誤謬はないけど,上述の翻訳手法である以上,
Google翻訳した文書を貼り付けるのは,原文を貼り付けるより酷いばかりか,
何も情報を提供せずに各自がリンク先なんかで情報を確認するよう要求するほうがよほどマシなくらい。

あなたは悪気なくGoogle翻訳を使って,スレに貢献しようとしたのかもしれない。
リンク先の文書の内重要と思われる部分をスレ本体に引用することは悪いことじゃないけれど,
そこでGoogle翻訳を使ってしまうのは,ちょっとキツい言い方になるけど「嘘を教える」ことに繋がってきてしまう。

もしこれからリンク先の文章を引用する機会があれば,原文を貼り付けるか,下手でもいいから自分で翻訳してみてね。

592 :デフォルトの名無しさん:2020/02/10(月) 11:56:29.56 ID:jvWR6fCp.net
>>591
はは、的外れすぎてワロタw
英語をそのまま貼ってもリンク先読まない人が多いから
単に変換しただけ。英語というだけでスルーする
日本語ならぱっと見でわかる。内容が気になったのならリンク先読みなさい。
読んだのなら貼り付けた意味があったということ

593 :デフォルトの名無しさん:2020/02/10(月) 19:24:20.30 ID:SWS6qR4K.net
宮城県に住んでるだったかの誰かにそっくりだな

594 :デフォルトの名無しさん:2020/02/10(月) 19:51:47 ID:RPv+4ALj.net
>>593
もう放っておこうぜ。

俺なりにかなり丁寧に説明したんだけど,
どうも何について文句を言われてるかすら分かっていないようだから。

595 :デフォルトの名無しさん:2020/02/10(月) 21:25:40.41 ID:MJVq5TQy.net
>>591
こういう輩は長文を読む力がないのだから、こういえばいいんだよ
「日本語でおk」

596 :デフォルトの名無しさん:2020/02/10(月) 21:40:51.77 ID:4n8TqQDg.net
擁護賛同してるのか?あそこの初っ端は間違っているけどな
直してやれよ

597 :デフォルトの名無しさん:2020/02/12(水) 17:16:49 ID:SPYER+lN.net
コマンドの速度を測りたいときに出力を/dev/nullに捨てるとその影響で
出力を捨てないときより速く計測されてしまうことがあるんだけど
例:
$ time { < /usr/bin/od od -A nx -t x1 -v; }
...
出力略
...
real 0m0.055s
user 0m0.042s
sys 0m0.008s
$
$ time { < /usr/bin/od od -A nx -t x1 -v > /dev/null; }

real 0m0.020s
user 0m0.020s
sys 0m0.000s

これを防ぐために「端末上に書き出してるのと同じくらいの負荷が書かるけど、実際には端末上に出力されない」
みたいな状況を作りたい。
おしえてください。

598 :デフォルトの名無しさん:2020/02/12(水) 17:58:00.53 ID:44kLfG7j.net
pv 使うとか

$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
$ time { < /usr/bin/od od -A nx -t x1 -v; }
:

real 0m0.404s
user 0m0.024s
sys 0m0.005s

$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
$ time { < /usr/bin/od od -A nx -t x1 -v | pv -q -L2M > /dev/null; }
real 0m0.458s
user 0m0.019s
sys 0m0.007s

599 :デフォルトの名無しさん:2020/02/12(水) 21:18:18.55 ID:ngmZ90wk.net
>>597
画面に出力されてる時間のせいだから無理じゃね?
/dev/ttyにだせば端末上に出力されてるけど標準出力に影響はない
あとは出した上でエスケープシーケンスで消すとか

600 :597:2020/02/13(Thu) 19:02:20 ID:qpgEIAWv.net
>>598
うーん。ちょっと偉そうな注文だけど
システム全体の設定を変更したり、
かつroot権限が必要なのはちょっと…

>>599
エスケープシーケンスは思い付かなかった。
でも出力の中に一つでも文字属性を元に戻すようなものが
含まれたりするとマズいよね(いやまあ,それに目を瞑ればいいだけの話なんだけど)…

どうも一般的な方法では無理そうなので,
ダラダラ出力させることにします。
困ることといえば端末のスクロール履歴が消えるくらいだし。

601 :デフォルトの名無しさん:2020/02/13(Thu) 19:45:08 ID:d+A9Zjku.net
標準出力バッファを無効にして/dev/nullに送り込むと良いかも。知らんけど

602 :デフォルトの名無しさん:2020/02/15(土) 07:57:33 ID:TqNhf8oX.net
ていうかtimeで測った絶対速度なんてほとんど信用できなくて、(ハードウェアの状態なんかに依存するから)
使い道としては複数のコマンドどうしの相対速度の比較が主でしょう。
ならば、両方とも> /dev/nullに捨てておけば、相対速度としては変化しないから速度比較の目的は果たせるのでは。

603 :デフォルトの名無しさん:2020/02/15(土) 09:41:54 ID:LBGCL7FY.net
リダイレクトとfdは概ね理解したけど3以上はどう使えばいいんです?
1>や2>は自然と使い分けてるけど1>&3を使う機会なくて
&>の方がまだ出番ある

604 :デフォルトの名無しさん:2020/02/15(土) 11:02:57 ID:vIJrSTGq.net
>>603
スクリプト開始時の stdout や stderr を保存しておくのに使うぐらいかなあ
# stdout を fd=3 にコピー
exec 3>&1

# fd=1,2 を foo.log にリダイレクト
exec > foo.log 2>&1

echo "foo.log に途中経過出力中です..." >&3
...
echo "処理B開始" >&3
...
echo "終了しました" >&3

605 :デフォルトの名無しさん:2020/02/15(土) 13:14:38.75 ID:QAGa8Flq.net
bashの問題なのか知らんけど、
CRとかLFとかTABとかVTとかをどう解釈するかって
制御するフラグってあったりする?OSがらみの設定でもいいけど

606 :デフォルトの名無しさん:2020/02/15(土) 14:59:47 ID:7hJxIdg7.net
>>605
sttyコマンドとか?
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/stty.html

607 :デフォルトの名無しさん:2020/02/15(土) 17:24:25.12 ID:LBGCL7FY.net
>>604
foo.logには標準出力とエラーが両方保存される
>&3がある行だけが画面に出力される
よく出来てますわ
ログ取りに使えるのか

608 :デフォルトの名無しさん:2020/02/15(土) 22:02:17.95 ID:7TGox9oB.net
>>606
sttyコマンドなのかな?

詳細は言えないけど、"予め構築された特定の環境"のみおかしくなる
(どうやって構築されたかは公開されてない)
それと近いと思われる環境を自分で作っても再現できなくて困っている。

evalやコマンド置換と改行やタブ含めたホワイトスペースに属する文字を
使ったときにおかしくなってるのはわかるんだが
どうやったらこんな状況を作れるんだろうか。なぞだ。

609 :デフォルトの名無しさん:2020/02/15(土) 23:22:52 ID:FhP/kA+H.net
頭悪い奴ってのは、おかしくなったとかエラーになったとかいうだけで、
どうなったのかメッセージはなんなのか、そこを書かないのは何でだぜ
おかしいのはシステムじゃなくておまえの頭だろうという

610 :デフォルトの名無しさん:2020/02/15(土) 23:28:09 ID:7TGox9oB.net
evalするときに何故か構文エラーが起きたり
ホワイトスペースがどこかで消えたりしている。

611 :デフォルトの名無しさん:2020/02/15(土) 23:28:21 ID:2teiXV5j.net
>詳細は言えないけど
なんだろ。単なるチラ裏なことを長々とというだけの
対処する側なのにその前置きでエスパー求めるなんてありえないし

612 :デフォルトの名無しさん:2020/02/15(土) 23:28:41 ID:7TGox9oB.net
もちろんその環境以外ではそんな事は起きていない。
だから制御する方法があるのだろうと思ってるがわからない。

613 :デフォルトの名無しさん:2020/02/15(土) 23:31:04 ID:2teiXV5j.net
>>610
何かを求めたいなら具体的に書こうな。Terminalでのまんまとか
そのままじゃ何か問題があるなら、似たようなのに加工できるだろう

614 :デフォルトの名無しさん:2020/02/15(土) 23:31:40 ID:7TGox9oB.net
>>613
具体的に書くとまずいことがあるからわざとぼやかしてる

615 :デフォルトの名無しさん:2020/02/15(土) 23:32:15 ID:2teiXV5j.net
だったら、チラ裏なげえな

616 :デフォルトの名無しさん:2020/02/15(土) 23:33:17 ID:7TGox9oB.net
短くしたら、お前が俺にレスさせるようにしただけ。
最初に詳細は言えないって書いてるんだから察しろ

617 :デフォルトの名無しさん:2020/02/15(土) 23:36:08 ID:2teiXV5j.net
そうちゃんと読みとって>>611と書いているんだが。すでに
何かをまだ期待してちょっとだけな>>610をとか続けるようだからなんだがな
これ以上もうないだろけど

618 :デフォルトの名無しさん:2020/02/15(土) 23:38:36 ID:7TGox9oB.net
俺が>>610と続けた後に
お前が>>611を書いたんだろ

時系列ぐらい把握しろやw

619 :デフォルトの名無しさん:2020/02/15(土) 23:40:02 ID:2teiXV5j.net
残念ながら、>>611は>>610なんてなかった時に書いたのだよ
お前は本当に自分視点しかなさすぎだぞw

620 :デフォルトの名無しさん:2020/02/15(土) 23:50:22.01 ID:7TGox9oB.net
>>619

>>610>>609へのレスだって気づいているか?
また書いていなかったとか言わないよなw

続けたのは俺じゃない。俺は最初から詳細は言えないと書いている。

621 :デフォルトの名無しさん:2020/02/15(土) 23:52:28.65 ID:cPtDrAlk.net
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\

622 :デフォルトの名無しさん:2020/02/15(土) 23:53:21.82 ID:2teiXV5j.net
何を言っているのかなあ。意味不明すぎ
読めなさすぎだろう、独りよがりすぎだろう

623 :デフォルトの名無しさん:2020/02/15(土) 23:57:25.05 ID:7TGox9oB.net
理解能力がないという告白を見た瞬間w

624 :デフォルトの名無しさん:2020/02/16(日) 00:03:10.55 ID:0ownCpNF.net
>>609をみて、「頭悪いやつ〜おかしいのは〜お前の頭だろう」というのは言い過ぎだろう、わからないでもないけどw
てか「詳細は言えないけど」てあるやん、まあ、そういうことだろう。チラ裏だけどなw
ということで、611を書いた

そしたら、直前同時に610があった(それが609に反応してのなんて当たり前だろう。逆になんでそうじゃないと思うのか意味不明すぎ)
なんだかな、またふわっとしたことを。なので、613を書いた(アンカー付けるてるのはそゆことだよ)
そしたらならなんか616があったりしたが、まあ前後してたんだよ。そんなの当たり前にあるだろうに

>>623
お前は本当に自分視点しかなさすぎだぞ、マジでw

625 :デフォルトの名無しさん:2020/02/16(日) 00:06:52 ID:0ownCpNF.net
誤 そしたらならなんか616があったりしたが
正 そしたらならなんか612があったりしたが

626 :デフォルトの名無しさん:2020/02/16(日) 09:10:15 ID:xg4O4sK0.net
sort -kについて正しく分かり易いサイトはないですか?

627 :デフォルトの名無しさん:2020/02/16(日) 12:16:49 ID:O89bDljg.net
>>626
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html

628 :デフォルトの名無しさん:2020/02/16(日) 12:17:20 ID:k2/UeE1A.net
えいごなのでわかりやすくないです

629 :デフォルトの名無しさん:2020/02/16(日) 12:50:45 ID:tUbalZD+.net
https://github.com/coreutils/coreutils/blob/master/src/sort.c

630 :デフォルトの名無しさん:2020/02/16(日) 13:15:28.05 ID:U5VJnWmt.net
>>627
中国語の解説をご所望だそうだ

631 :デフォルトの名無しさん:2020/02/16(日) 14:38:33.35 ID:O89bDljg.net
おめーらイジワルだなw

632 :デフォルトの名無しさん:2020/02/16(日) 15:33:45.11 ID:iNVxJNOu.net
分かりやすい
http://tldp.org/LDP/GNU-Linux-Tools-Summary/html/x6993.htm

633 :デフォルトの名無しさん:2020/02/17(月) 08:01:59.15 ID:ZjAffcZp.net
与えられた数字のファイルの行番号になにかを書き込むスクリプトってどう書くのが一番いいですかね。
一応 今 思い付いてるのは
与数をNNN,書き込む文字列をXXXとして
sed -n -e 'NNNs/.*/XXX/p'
↑こういうのかなと思ったんだけど
これだと新規ファイルを作成する目的には使えない…

634 :デフォルトの名無しさん:2020/02/17(月) 10:14:55 ID:LO6gJc6j.net
nl使えばいいだろ。POSIX標準の基本コマンド一覧見ろや

635 :デフォルトの名無しさん:2020/02/17(月) 10:37:47 ID:ZjAffcZp.net
>>634
nlにそんな機能あるの?
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/nl.html
↑ここ見る限り
指定した行になにかを書き込むなんていう機能なさそうなんだけど。

636 :デフォルトの名無しさん:2020/02/17(月) 10:47:12 ID:8g99SQEJ.net
こういう事?

seq 10 | sed '5s/.*/& Here/'

637 :デフォルトの名無しさん:2020/02/17(月) 11:12:00.77 ID:ZjAffcZp.net
>>636
そうそう、そんな感じ。
行番号自体は出力に要らないけどね。
ただ、それだと >>633 でも言った通り、
元のファイルがない状態から生成できないんだよ。

示してくれたスクリプトでも「10行出力する」
っていう前提があって始めて機能するよね。
やりたいのは全部で何行必要か分からない状態で
次々に指定した行に文字列を書き込むってこと。

638 :デフォルトの名無しさん:2020/02/17(月) 14:40:41.78 ID:xPbhxlpI.net
配列に書いて要素番号と共に出力すれば

639 :デフォルトの名無しさん:2020/02/17(月) 14:53:39.21 ID:qj5C8HtX.net
おまえらよく

与えられた数字のファイルの行番号になにかを書き込むスクリプト
で何がいいたいのかわかるな

与えられた 数字のファイル の行番号なのか
与えられた数字 のファイルの行番号なのか
与えられた数字のファイル の行番号なのか
与えられた数字のファイルの行番号 なのか
さっぱりなんだがw

入力と出力の例を出せば、すぐに解決する問題だろうに

640 :デフォルトの名無しさん:2020/02/17(月) 14:56:06 ID:qj5C8HtX.net
> やりたいのは全部で何行必要か分からない状態で
> 次々に指定した行に文字列を書き込むってこと。
これもさっぱり

何行必要かわからないって、何の行数なのか
次々に指定した行って、どうやって指定するつもりなのか

示したスクリプトは別に10行という前提じゃなくても機能するし
元のファイルがないって、元のファイルってどのファイルだよ?
なければ作ればいいだけだろ?

641 :デフォルトの名無しさん:2020/02/17(月) 15:06:30.32 ID:y136Nw0W.net
行ごとに何か処理したいならawkの出番なのでは?

642 :デフォルトの名無しさん:2020/02/17(月) 15:42:52.76 ID:ZjAffcZp.net
>>639
入力
linenumber=78
value='hoge huga'
linenumber=805
value='foo bar'
...

出力
(空行)...
(78行目)hoge huga
(空行)...
(80行目)foo bar

こんな感じっすね。
入力は(この例では)変数に格納するような形式にしましたが
別にこれと決まった訳じゃないです。

643 :デフォルトの名無しさん:2020/02/17(月) 15:45:24.56 ID:ZjAffcZp.net
>>641
うーん。それはまあ,sedでもawkでも同じことが言えますけど
どちらも既存のファイル(またはパイプ越しの既存の出力)に対しての行処理
が得意なんですよね。

一方いまやりたいことはファイルの新規作成であって
しかも最後まで行の総数が分からないという……

これはawkでどうにかするのは難しいのではと思います。

644 :デフォルトの名無しさん:2020/02/17(月) 15:49:37.43 ID:qj5C8HtX.net
行番号と文字列のペアが入ったデータ(ファイル)があって、
それに従って別のファイルの指定された行の頭に文字列を入れるってことね

ん?別のファイルの行の頭に文字列を入れるのか?
それとも単に、その出力通りに出すだけなのか?
その出力を作るだけなら簡単だろうけど・・・あーいやどちらも大差ないかw

645 :デフォルトの名無しさん:2020/02/17(月) 15:50:05.60 ID:P9Oy3OK5.net
先に行指定の最大値を取得すればええやろ?

646 :デフォルトの名無しさん:2020/02/17(月) 15:54:20 ID:y136Nw0W.net
それならもう無理せずperl,ruby,pythonあたりで書いたらいいんでないの?

647 :デフォルトの名無しさん:2020/02/17(月) 16:01:09.81 ID:qj5C8HtX.net
入力ファイル形式を
78 hoge hug
805 foo bar
とする。行番号は小さい順に並んでいるものとする。
並んでいないならsortコマンドで並び替えられるのでどうでもいい

あとは、こんな感じのスクリプトを書いて

i=1
while read -r num string; do
 while [ $i -lt "$num" ]; do
  echo
  i=$((i+1))
 done
 echo $string
 i=$((i+1))
done

cat data.txt | script.sh とかすればいい
echoで空行出す所は、seqとかprintf '%s' "$@"とか使えば短くできるだろうな。

648 :デフォルトの名無しさん:2020/02/17(月) 16:15:26.16 ID:qj5C8HtX.net
>>646
ロジックはどの言語でも変わらないので
シェルスクリプトでそれを書けばいいだけ

649 :デフォルトの名無しさん:2020/02/17(月) 16:25:32 ID:qj5C8HtX.net
短くしてみた。バグとかはしらん

i=1 num=0
while [ "$i" -le "$num" ] || read -r num string; do
[ "$i" -eq "$num" ] && echo "$string" || echo " "
i=$((i+1))
done

650 :デフォルトの名無しさん:2020/02/17(月) 16:31:22 ID:2IQo7lRr.net
>>637
どういうことをしたいのかよくわからんが、とりあえずtouchしておけばファイルは作れるんでないの?

651 :デフォルトの名無しさん:2020/02/17(月) 18:55:51 ID:P9Oy3OK5.net
一旦配列に入れてからjoin風に出力
入力はsortされてなくても可

#! /usr/bin/env bash
while read -r num string; do
array[num]="$string"
done

index=( "${!array[@]}" )
for (( i=1; i<=${index[-1]}; i++)); do
if [ -v array["$i"] ];then
echo "${array[$i]}"
else
echo
fi
done

652 :デフォルトの名無しさん:2020/02/17(月) 21:12:48.06 ID:ZjAffcZp.net
>>650
いや,ただたんに新規作成したい訳じゃない…

653 :デフォルトの名無しさん:2020/02/18(火) 03:26:33 ID:enVFBik2.net
Ruby で作った

以下のコードを、script.rb に保存して、
「ruby script.rb 行番号指定ファイル 入力ファイル」と実行する

ARGV[ 0 ] は、行番号指定ファイル
ARGV[ 1 ] は、入力ファイル

結果は、標準出力に出したので、ファイルへリダイレクトして下さい。
ただし、入力ファイルへはリダイレクトしないように!

行番号指定ファイルは「数字・半角空白・文字列」の順番です。
ただし、行は数字でソートされていること

3 あ い
7 ab

# 行番号指定ファイルを、[ 行番号, 文字列 ] の、2次元配列に読み込む。
# 1行ずつ処理する。末尾の改行を削除する
line_num_ary = File.foreach( ARGV[ 0 ], chomp: true ).with_object( [ ] ) do |line, ary|
tmp_ary = line.split( nil, 2 ) # 空白で、2つに分割する
tmp_ary[ 0 ] = Integer( tmp_ary[ 0 ], 10 ) # 数値型に変換する
ary.push tmp_ary
end

次へ続く

654 :653:2020/02/18(火) 03:27:41 ID:enVFBik2.net
last_line_num = line_num_ary.last[ 0 ] # 最後の行番号
line_count = nil # ファイルの行数

if FileTest.file? ARGV[ 1 ] # 入力ファイルがあれば
open( ARGV[ 1 ] ) do |f|
while f.gets; end # ファイルを最後まで読む
line_count = f.lineno # ファイルの行数
end
# 最後の行番号の方が、入力ファイルの行数よりも大きい場合は、空行を追加して、同じ行数にする
if last_line_num > line_count
open( ARGV[ 1 ], "a" ) do |f| # 追記
( last_line_num - line_count ).times { f.puts }
end
end
else # 入力ファイルが無ければ、最後の行番号の数だけ、空行を挿入する
open( ARGV[ 1 ], "w" ) do |f| # 書き込み
last_line_num.times { f.puts }
end
end

# 末尾の改行を削除して、配列に読み込む
input_ary = File.readlines( ARGV[ 1 ], chomp: true )

# 行番号で指定された行の、内容を置き換える
line_num_ary.each { |ary| input_ary[ ary[ 0 ] - 1 ] = ary[ 1 ] }
puts input_ary

655 :デフォルトの名無しさん:2020/02/18(火) 03:35:49 ID:dYxIHNEw.net
>>649
これが一番だな。短くてbash依存なし。ruby依存なしw

656 :デフォルトの名無しさん:2020/02/18(火) 09:24:28 ID:2AC9Ct1n.net
いや、それちょっとした文字列操作したくなった時点で相当めんどくさくなるだろ。。
てきとーなスクリプト言語使う方が正解だわ。
シェルで書くことに意固地になってるだけだろ。

657 :デフォルトの名無しさん:2020/02/18(火) 09:30:40 ID:HqsHcaRa.net
別にならんだろ。まああれだ、シェル芸しかできなくて
シェルプログラミングできないやつが
ごまかすために言ってるんだろうなと

658 :デフォルトの名無しさん:2020/02/18(火) 09:53:00 ID:2AC9Ct1n.net
あ、普通に馬鹿なんだな。。
もしかしてユニケージの人か?

659 :デフォルトの名無しさん:2020/02/18(火) 10:03:42 ID:HqsHcaRa.net
ユニケージを見ればわかるが、あれは使い物にならない
特定業務専用のコマンド集でしか無い
そんなことよりさ、自分でコード書けないの?

660 :デフォルトの名無しさん:2020/02/18(火) 10:04:48 ID:HqsHcaRa.net
文字列操作の何が面倒なのか知らんが、文字列操作はC言語よりもずっと楽なんだがね。
コマンド呼び出しだけを見れば他のどの言語よりも優れてるし

661 :デフォルトの名無しさん:2020/02/18(火) 10:42:09 ID:X2bVDQHa.net
> てきとーなスクリプト言語
シェルスクリプトとか?w

662 :デフォルトの名無しさん:2020/02/18(火) 14:37:02 ID:gCN/+gaX.net
>>660
ていうか実はシェルスクリプトって
PythonでいうC API的なものの嚆矢であり最前線なんだよね。
C言語の標準入出力・ファイル読出/書込をシェルでやって
数値計算とかバイナリ解析とかそういう部分はC言語でコマンド作って任せるっていう。

663 :デフォルトの名無しさん:2020/02/18(火) 15:45:01 ID:fdBjlYYo.net
IT系の仕事してるけどアプリ作ってるときはコンパイルは普通だった
でもインフラの仕事をするとシェルスクリプト多数だった
シェルスクリプト作ってる人たちはコンパイルの概念が分からないらしかった
プログラムはビルドしてリリースしてとソースと実行ファイルの管理が面倒だけど
シェルスクリプトって即物的なのがいい

664 :デフォルトの名無しさん:2020/02/18(火) 17:27:39.45 ID:X8dqmLc9.net
1 2
3 4
みたいなhoge.txtがあって
cat hoge.txt | sed "s/\t/,/g" > piyo.csv
ってやってもhogeのままなんですけど
cat hoge.txt | tr " \t" "," > piyo.csv
ってやると上手くいきました、mac環境なんですけど
何が原因なのか分かりません…
sedの置換対象に数字を入れた場合は上手くいきました

665 :デフォルトの名無しさん:2020/02/18(火) 17:30:18.44 ID:hjlsDnk2.net
1 と 2 の間にあるのがスペースなんじゃ…

666 :デフォルトの名無しさん:2020/02/18(火) 20:22:18 ID:wp4bvOJX.net
>>664
sed のダブルクォーテーションをシングルクォーテーションにするとどう?
もしくは s/\t/... じゃなくて s/\\t/... とか

>>665
tr の場合うまくいく理由の説明ができないんじゃ?

667 :デフォルトの名無しさん:2020/02/18(火) 20:27:51 ID:VB0SzzBs.net
>>664
mac の sed は \t をタブ文字として扱わないらしいね

https://stackoverflow.com/questions/5398395/how-can-i-insert-a-tab-character-with-sed-on-os-x/5398453#5398453

sed "s/$(printf '\t')/,/g" はどうかな
printf も \t 非対応なんてことはさすがに無いと思うけど

668 :デフォルトの名無しさん:2020/02/18(火) 20:33:06 ID:hjlsDnk2.net
tr " \t" "," となっていてスペースが含まれているから
上手くいっているんじゃないかと

669 :デフォルトの名無しさん:2020/02/18(火) 21:52:28 ID:8C0JMYsF.net
665~668の方まで皆さんありがとうございます
とりあえず痴漢の成功例を○、上手くいかなかったのを×として
× tr " " ","
○ tr "\t" ","
× sed "s/\t/,/g" (\tを\\tに変える、クオーテーションを変えるなどしても同様)
○ sed "s/$(printf '\t')/,/g"
という感じでした。
macとlinuxでオプション違うのは経験で知ってたんですが正規表現にまで
関わってくるんですね…良い事を教えていただいてありがとうございます。

670 :デフォルトの名無しさん:2020/02/18(火) 22:18:45 ID:ObTpNy6/.net
macならgnu-sedをインストールしてそっち使ったほうが良い

671 :デフォルトの名無しさん:2020/02/19(水) 11:18:51.97 ID:nP6c4IYT.net
痴漢の成功例っていやだなw

672 :デフォルトの名無しさん:2020/02/19(水) 12:03:18.50 ID:pMNWrift.net
気が付かなかったww

673 :デフォルトの名無しさん:2020/02/21(金) 06:21:58.42 ID:A/822pua.net
$ ed -s <(seq 3) <<< $'3m1\n,p'
1
3
2
$ ed -s <(seq 3) <<< '3m1\n,p'
?

これでコマンドラインからedが使えるけどこの$ってどんな効果が?
付けないとこの通り表示されないし

674 :デフォルトの名無しさん:2020/02/21(金) 07:58:16 ID:0dzJ+7kH.net
>>673
Bashの機能でエスケープシーケンスを解釈する
'\n'だと\nに展開されるだけだけど
$'\n'だと改行に展開される。
あと$'\u30A2'みたいにUnicode番号も指定できる。

675 :デフォルトの名無しさん:2020/02/21(金) 14:48:04 ID:A/822pua.net
>>674
そういやシングルクォートなのに改行できてるな
$ echo $'foo\nbar'も改行されるし中々便利そうだ
ありがとう

676 :デフォルトの名無しさん:2020/02/22(土) 16:39:03 ID:C/dFKPoq.net
kshのリポジトリのmasterが3400ぐらいあったコミットが13に減っていてワロタw

677 :デフォルトの名無しさん:2020/02/25(火) 12:18:34 ID:S19Y4jrS.net
grepの-eオプションみたく複数回指定できるオプション引数って
シェルスクリプトでどうやって処理するのが一般的なんかな。

getopts(1)の例
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/getopts.html#tag_20_54_17
とかに載ってるような引数付き-bオプションに対して変数bflag=1, bval="$OPTARG"にする方法だと
最後に出現した-b XXXしか感知できないよね。
-b XX1 -b XX2 -b XX3
↑こういうコマンドライン引数があったときに-bオプションに対する引数を全部認識するようにしたい。

そういう処理をしているスクリプトのソースへのリンクとか教えてもらえるとすごく助かる。

678 :デフォルトの名無しさん:2020/02/25(火) 12:53:16 ID:5KSIeSvf.net
出現するたびになにかやればいいだけじゃん

679 :デフォルトの名無しさん:2020/02/25(火) 14:13:23 ID:oSeHo6cg.net
>>677
一般的かどうか知らないけど配列に入れて要素の数だけループさせてる
別のコマンドに渡すことが大半なのでループ内ではコマンド文字列を生成して実行はループの外でやる

while getopts “e:” opt; do
case "$opt" in
“e”) strings+=("$OPTARG");;
esac
done
shift $(($OPTIND - 1))

for value in "${strings[@]}"; do

done

680 :デフォルトの名無しさん:2020/02/25(火) 15:00:07.73 ID:mMwfySZI.net
bash依存は甘え

681 :デフォルトの名無しさん:2020/02/25(火) 15:30:00.20 ID:K+FIgRaj.net
>>679
ありがとう!
配列が使えるシェルならそれが一番いい方法かな。

682 :デフォルトの名無しさん:2020/02/25(火) 15:45:41.88 ID:K+FIgRaj.net
今更だけど、試しにNetBSDのgrepのソースコードを覗いてみたら、pattern[]配列に格納してたわ。
POSIXシェルみたいな配列に対応してないシェルでも0x1Fユニット区切り文字とか使えばいいかな。

683 :デフォルトの名無しさん:2020/02/25(火) 17:02:15 ID:eOOTHTW4.net
全てのシェルに配列はあるだろ? $@を使えばいいんだよ
あとはqiitaででも探せ。答えはそこにある。

684 :デフォルトの名無しさん:2020/02/25(火) 17:24:31 ID:S19Y4jrS.net
>>683
コマンドライン引数の処理において
$@を使ってもいいのかな。
普通に上書きしちゃいそうな気がするが。

685 :デフォルトの名無しさん:2020/02/25(火) 17:25:41 ID:S19Y4jrS.net
サブシェルで処理すれば$@は引き継がれないから影響ないけど
そうすると今度は肝心要の、現在処理しているコマンドライン引数を全く参照できなくなる。

686 :デフォルトの名無しさん:2020/02/25(火) 17:46:16 ID:eOOTHTW4.net
サブシェルなんかいらねーだろ
関数使えよ

687 :デフォルトの名無しさん:2020/02/25(火) 22:33:40.09 ID:S19Y4jrS.net
>>686

頭悪くて恥ずかしい限りだが、
スクリプトの例を書いてもらえないか。

excmd -a XXX -a YYY -a ZZZ
みたいなコマンドライン引数を解釈して、
全部読み切った後に-aオプションに対するオプション引数をそれぞれ取得できるっていう。
全部読み切った後ってのは、getoptやらで最後のオプションまで読み切って、
引数関連のエラーがないことを確かめてからってことね。
「-aオプションの出現を感知するたびに標準出力に出す」みたいなのじゃなく。

688 :デフォルトの名無しさん:2020/02/25(火) 22:48:26.39 ID:8Uixj76j.net
>>687
ヒント
2番目と4番目と6番目を取り出せばいいだけ

689 :デフォルトの名無しさん:2020/02/26(水) 08:09:52.20 ID:vrfGqddo.net
>>688

-aの位置の次にある引数を取得するってこと?
でもそうすると
-bcaXXX
↑こういうときはどう解析するの?(-b,-cは引数を取らないオプション)
この形式のオプションもPOSIXでは許可されてるから
当然解析できなければならないけど。
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html

690 :デフォルトの名無しさん:2020/02/26(水) 08:25:40.38 ID:iwwM4ZEx.net
>>689
引数処理にこだわり始めるとスクリプト実行して引数解析終わるまで時間がかかるようになって
使い物にならなくなるので複雑な記法は全部捨てたわ
POSIXで許可されているから実装しなきゃならないというならPOSIXを窓から投げ捨てるべき

691 :デフォルトの名無しさん:2020/02/26(水) 08:29:52.36 ID:kXv4PxDr.net
>>690
下手すぎw どうせgrepとかsedとか外部コマンド持ち出してやったからだろ
だから外部コマンドなし縛りをするんだよ

>>689
話が変わってる。POSIX対応したいならgetoptsとかでは無理
qiitaに対応してるサンプルコードがあるから探せ

692 :デフォルトの名無しさん:2020/02/26(水) 09:28:16.44 ID:9H3dDcdo.net
bash によるオプション解析 - Qiita
https://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb
getoptsの存在すら知らずに横着して=~を使ってすまんな
オプションの集約ってこうも面倒だったのね

693 :デフォルトの名無しさん:2020/02/26(水) 09:48:23.19 ID:re2OdmIW.net
timeoutで終了するプログラムの最後の1行だけを表示させたいどうするの?

694 :デフォルトの名無しさん:2020/02/26(水) 09:54:37.39 ID:kXv4PxDr.net
>>692
どの言語にもオプション解析用のライブラリがある理由が分かったろ?

695 :デフォルトの名無しさん:2020/02/26(水) 11:26:08.87 ID:vrfGqddo.net
ちなみにgetoptsコマンドはPOSIXで定義されてるけど,実はPOSIXが定めるオプション書式に対応していないっていう。
まあOpenGroup側も「任意のオプション引数は歴史的な理由以外で使ってはならない」って言ってる訳だし
仕方無い部分もあるけど。
一方で複数回登場する引数付きオプションは,ちゃんと現行のアプリケーションでの使用も許可されているにもかかわらず
getopts自身はそういうオプションに対する便利な機能をなんら提供してない。

696 :デフォルトの名無しさん:2020/02/26(水) 13:10:48.18 ID:iFRpldfA.net
>>695
任意のオプション引数ってどういうもののことを言ってる?

697 :デフォルトの名無しさん:2020/02/26(水) 13:41:46 ID:vrfGqddo.net
>>696
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html
ここを読め…と突き放すのはあんまりなんで説明すると

“optional option-argument”---任意のオプション引数っていうのは,
当該オプションのあとにそのオプションに対する(一つの)引数が指定されてもされなくてもいいような
オプションのこと。
manページの「書式」節で
somecmd -o[arg]
みたいに書かれている場合が該当する。
これは
somecmd -o
の時は「オプション-oが引数なしで指定された」と解釈し
somecmd -oXXX
の時は「オプション-oが引数XXXで指定された」と解釈,
somecmd -o XXX
のときは「オプション-oと,(それとは直接関係ない)被演算子XXXが指定された」と解釈する
という決まりになってる。

なおPOSIXでは規程されてないけど,長いオプションの場合は
任意のオプション引数を指定したければオプションとオプション引数を=で結ぶのが通例みたい。
--long-opt=XXX
↑こういう感じ。

698 :デフォルトの名無しさん:2020/02/26(水) 13:46:00 ID:Z7ha8duC.net
>>697
ああ、OKOK、ちゃんと分かってるね

699 :デフォルトの名無しさん:2020/02/26(水) 15:55:24.01 ID:vrfGqddo.net
>>698
分かってもらえたみたいでよかった。

700 :デフォルトの名無しさん:2020/02/26(水) 23:24:46.41 ID:iwwM4ZEx.net
>>691
使い物にならんから外部コマンドなし縛りにして、その結果複雑な書き方捨てたって事なんですが...

個人的には -help が --help の書き間違いとして拾ってくれずに -h -e -l -p になるのが気に食わんのですよ

701 :デフォルトの名無しさん:2020/02/27(Thu) 00:12:01 ID:nCyLO+2A.net
Ruby の、OptionParser では、

require 'optparse'

ARGV.replace %w(-e abc -e あ)

opts = { }
ARGV.options do |o|
o.on( "-e パターン", "絞り込む" ) { |x|
( opts[ :pattern ] ||= [ ] ).push x } # 配列に追加する

o.parse!
end

p opts #=> { :pattern=>["abc", "あ"] }

702 :デフォルトの名無しさん:2020/02/27(Thu) 01:10:41 ID:WuLbJO/f.net
>>700
その一文字オプションの連結に対応しなければいいだけじゃん

703 :デフォルトの名無しさん:2020/02/27(木) 10:15:09.64 ID:1d0gnp8c.net
>>702
>>700じゃないけど
彼は実装者としての立場ではなくて
利用者としての立場からの意見では?
つまりオプションパーサーを作ってるんじゃなくて
既存のオプションパーサーが-help記法に対応してないってこと。

704 :700:2020/02/28(金) 00:12:31 ID:sbmuwMBZ.net
>>702
はい。 その通りで連結は未対応なスクリプト書いています。
後は値が連結しているタイプ (--foo=goo) も未対応にしています。

705 :703:2020/02/28(金) 17:35:34.53 ID:+yZJUcOk.net
>>704
やっぱりね

706 :デフォルトの名無しさん:2020/02/28(金) 21:07:42 ID:11SJpN8G.net
> 個人的には -help が --help の書き間違いとして拾ってくれずに
-help が --help の書き間違いとして拾ってくれるものなんてある?

707 :デフォルトの名無しさん:2020/02/28(金) 21:16:46 ID:9ZnEM/be.net
>>700
> 使い物にならんから外部コマンドなし縛りにして、その結果複雑な書き方捨てたって事なんですが...

外部コマンドを使うと遅くなって使い物にならないから、
外部コマンドなし縛りで自分でパーサーを実装すればいいだけ。
それができないから「下手すぎw」と言ってるわけです。
まあ自分で作れないなら仕方ないけどw

708 :デフォルトの名無しさん:2020/02/29(土) 08:02:48.75 ID:A8pIm3Di.net
うわぁー

709 :デフォルトの名無しさん:2020/02/29(土) 08:10:25.23 ID:wnu08hYu.net
外部コマンドを使おうが使うまいが、パーサーのアルゴリズムに大差ないだろ?
今まで外部コマンドを使ってパースしてたなら、
それを外部コマンドを使わずにパースするだけじゃん
何が難しいというのか?

710 :700:2020/02/29(土) 09:04:49.63 ID:toFJGN/1.net
>>706
普通ないんだが、注意力が無い何かなのか、問い合わせしてくるユーザーもいて
対応に苦慮することになるんだわ

>>707,709
引数を前から順番に処理してくれない getopt を使わないと決めた途端に難しくなったんだわ
getopt 使わずに -zxf (ファイル名) を -z -x -f (ファイル名) に分割簡単にできる?
-zfx (ファイル名) にしたときエラー処理/クレーマー処理できる?

711 :デフォルトの名無しさん:2020/02/29(土) 09:27:10 ID:Z90YN+Q9.net
>>710
問い合わせくるユーザーが居るだけで対応する必要ないじゃん

> 分割簡単にできる?
俺はできるw

712 :デフォルトの名無しさん:2020/02/29(土) 13:13:04.89 ID:IP0SEm6N.net
なんか、車輪の再発明みたいなことになってるなw

713 :デフォルトの名無しさん:2020/02/29(土) 14:05:54.81 ID:MM7sekhX.net
getoptが使い物にならないんだから
作らないとしょうがない

714 :デフォルトの名無しさん:2020/03/01(日) 11:37:30 ID:4tQoD8Fw.net
× getopt
○ getopts

715 :デフォルトの名無しさん:2020/03/01(日) 12:51:34.60 ID:4c8klxdl.net
シェルスクリプト用のオプションパーサーって無いの?getopt/getopts以外で

716 :デフォルトの名無しさん:2020/03/01(日) 12:56:04.13 ID:4tQoD8Fw.net
>>715
https://github.com/docopt/docopts

717 :デフォルトの名無しさん:2020/03/01(日) 13:09:15.84 ID:4c8klxdl.net
>>716
それはgo製じゃん

718 :デフォルトの名無しさん:2020/03/01(日) 13:11:39.38 ID:TiMroEot.net
> docopts : the command line wrapper for bash.

719 :デフォルトの名無しさん:2020/03/01(日) 13:16:40 ID:4c8klxdl.net
bashってのもマイナス点だな

720 :デフォルトの名無しさん:2020/03/01(日) 14:02:23 ID:4tQoD8Fw.net
>>717
シェルスクリプト用のあれこれはすべてシェルスクリプト製じゃないといけない
なんて思ってないよな?

俺の知っているシェル・OS環境は,
sortやgrepみたいな外部コマンドどころか for文や変数処理みたいなシェルの内部動作も
みんなC言語で書かれてるんだが…

721 :デフォルトの名無しさん:2020/03/01(日) 14:28:49 ID:4c8klxdl.net
シェルスクリプト製じゃないと、1つのファイルに出来ないじゃん

722 :デフォルトの名無しさん:2020/03/01(日) 15:29:04 ID:4tQoD8Fw.net
× シェルスクリプト用のオプションパーサー
○ シェルスクリプト製のオプションパーサー

質問するときは明確な言葉で。

723 :デフォルトの名無しさん:2020/03/01(日) 16:13:34 ID:DvIm3g7W.net
ID:4c8klxdlの無能さ

724 :デフォルトの名無しさん:2020/03/02(月) 16:01:50.45 ID:s5dtAso/.net
外部コマンド使いなくないならBusyBoxみたいなの使うしかないよな。

725 :デフォルトの名無しさん:2020/03/02(月) 16:35:15 ID:+7p1D0tE.net
ビルトインコマンドでいいじゃん

726 :デフォルトの名無しさん:2020/03/02(月) 23:40:28.80 ID:8PHDRupm.net
-help が --help の書き間違いには、ならない。
-help は、h,e,l,p のオプションを連結した書き方で、文法的に正しいから

だから、オプションの連結を禁止すればよい

そうすれば、-h, -e, -l, -p みたいに、書かないといけないから、
-help は、絶対に間違いになるから、指摘できる

オプションの連結は、情報処理の教育を受けた社員を想定しているから、
勉強していないような素人には、難しすぎるw

727 :デフォルトの名無しさん:2020/03/03(火) 07:08:07.59 ID:IKAJxND7.net
根本は中国人なのにマスコミも政府も絶対言わないし、
制限しない。

311の政府対応と同じ

政権変わっても変わらん

728 :デフォルトの名無しさん:2020/03/03(火) 07:53:58.76 ID:4u1zxYLS.net
誤爆するガイキチ

729 :デフォルトの名無しさん:2020/03/03(火) 09:24:57 ID:MNbayHdo.net
>>726
情報処理の教育を受けた社員しか想定していないので問題ない

730 :デフォルトの名無しさん:2020/03/03(火) 10:15:38 ID:l2g6jfLd.net
あとは自力で勉強探究心があるギーク向けだしな

731 :デフォルトの名無しさん:2020/03/03(火) 10:44:21 ID:z64lrdXB.net
find「せやな」

732 :デフォルトの名無しさん:2020/03/03(火) 12:18:09.49 ID:3ukr+OhM.net
任意のオプション引数ってさ、
-help が -h elp って解釈されるよね?
-h -e -l -p とどうやって区別するの?

-help って書いた時どっちの意味になるの?

733 :デフォルトの名無しさん:2020/03/03(火) 12:32:47.35 ID:yHaKKNdM.net
あるスクリプトを作っていて、gitで管理しています。

~/src ← gitで管理
~/src/script.sh ← あるスクリプト
~/src/inc.sh ← あるスクリプトから読み込むライブラリ

script.sh から inc.sh を読み込むときに、
. ./inc.sh と書いています

script.sh をどのディレクトリからでも実行できるように
~/bin ディレクトリにシンボリックリンクを作成しました。
そして実行するとエラーになりました。

~/bin/inc.sh を読み込もうとしているからだと思いますが
いい解決方法はないでしょうか?

734 :デフォルトの名無しさん:2020/03/03(火) 14:02:09.02 ID:5O39EjRd.net
>>733
~/bin/script.sh をシンボリックリンクではなく
cd ~/src && exec ./script.sh "$@"
を実行するシェルスクリプトにする

735 :デフォルトの名無しさん:2020/03/03(火) 14:06:21 ID:yHaKKNdM.net
>>734
いろいろあって、そこはシンボリックじゃないとだめなんですよ

736 :デフォルトの名無しさん:2020/03/03(火) 17:07:25 ID:FfxSBx1I.net
>>732
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html
ここ読んで、どうぞ。

737 :デフォルトの名無しさん:2020/03/03(火) 17:55:54 ID:n9Ghdw3q.net
>>733
inc.shも~/bin(や特定固定のとこ)にシンボリックリンクを置いてしまえ
とか
pathme="$(which "$0")";
[ -L "$pathme" ] && pathme="$(readlink "$pathme")"
. "$(dirname "$pathme")/inc.sh"
とか

738 :デフォルトの名無しさん:2020/03/03(火) 18:16:56 ID:n9Ghdw3q.net
>>733
>~/bin/inc.sh を読み込もうとしているからだと思いますが
./inc.sh とかいう相対パスは現在のワーキングディレクトリ/カレントディレクトリからのだよ。sourceも同じく特殊なことはせずに
"$(pwd)/inc.sh" を読み込もうとしているのだろう

739 :デフォルトの名無しさん:2020/03/03(火) 19:32:36.52 ID:PcLjcySC.net
>>737
やっぱりreadlink使うしか無いですかね。
シンボリックのシンボリックのシンボリックとか考慮すると
readlink -fが必要になるけど、macOS版だとgreadlinkじゃないと動かないし
そもそもgreadlinkが入ってないとか、その他のOSではどうなるの?とか。
そういう面倒なコードはライブラリにしたいけど、そのライブラリを読み込むのに苦労するというw

740 :デフォルトの名無しさん:2020/03/03(火) 19:58:06.90 ID:BC6YzT5m.net
後出しかよ
シンボリックのシンボリックのシンボリック
なら、三行書けばいいだけじゃん
やっぱりって何がやっぱりなんだか

741 :デフォルトの名無しさん:2020/03/03(火) 20:06:11.93 ID:BC6YzT5m.net
pathme="$(command -v "$0")" || pathme="$0"
[ "$pathme" = "" ] && pathme="$0"
while [ -L "$pathme" ]; do
pathme="$(readlink "$pathme")"
done
. "$(dirname "$pathme")/inc.sh"
で、いいんじゃねえのかよぉ?なんでこんな簡単な対処も?と思うのでなんか穴があるか???
whichってPOSIXじゃなかったのね。煩そうだからそこも

742 :デフォルトの名無しさん:2020/03/03(火) 20:07:32.72 ID:BC6YzT5m.net
あ、二行目はいらない。もしくは一行目の||の後ろ

743 :デフォルトの名無しさん:2020/03/03(火) 20:41:22.45 ID:Lk6RorVj.net
>>740
沸点低すぎ。自分が欲しい情報を最初から全部準備しておけってか?
間違えるのが怖いってやつだなw

744 :デフォルトの名無しさん:2020/03/03(火) 20:47:57.53 ID:BC6YzT5m.net
なんかぐちぐち言っているけど、そんなこと対処すぐ自分でできるでしょなことをぐちぐちとという
ぐちぐち言う奴にはリアルでもムカつく沸点は低いのは確かだがなw

それと後出しなら当然のようにではなくて、すまんがが先にありがだろうに、何を当たり前のようにというのだな。リアルでもねw

745 :デフォルトの名無しさん:2020/03/03(火) 20:55:19 ID:dHOuVCIc.net
意訳 謝罪しろ

746 :デフォルトの名無しさん:2020/03/03(火) 20:57:44.45 ID:BC6YzT5m.net
そう読めるなら、沸点は俺より低すぎだな

747 :デフォルトの名無しさん:2020/03/03(火) 20:59:54.63 ID:FfxSBx1I.net
つまり自分の沸点の低さは自覚してるって訳か。
ひとまず安心した。

748 :デフォルトの名無しさん:2020/03/03(火) 21:00:37.28 ID:BC6YzT5m.net
うむ。キレやすく冷めやすいなw

749 :デフォルトの名無しさん:2020/03/03(火) 21:01:39 ID:UParEwxG.net
相手が何も考えてないと思ってるんだろうね。
そのやり方にはこういう問題があるって言ったら、
知ってるなら先にかけ!だもんな(苦笑)

750 :デフォルトの名無しさん:2020/03/03(火) 21:04:21.79 ID:BC6YzT5m.net
読めてないな、全然w
のくせに絡みたいのね。苦笑がいい味付けだねw苦笑いするぞ

751 :デフォルトの名無しさん:2020/03/03(火) 21:05:27.34 ID:V11R45Nz.net
毎度ながら回答者に問題があるよな

  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\

752 :デフォルトの名無しさん:2020/03/03(火) 21:07:13.53 ID:BC6YzT5m.net
何をそんなにひ弱なのかわからん...当事者でもないのに
>>740でそんなにダメージ受けるのか?一応ちゃんと回答してもいるんだがな。ひ弱すぎだろう

753 :デフォルトの名無しさん:2020/03/03(火) 21:44:55.64 ID:FfxSBx1I.net
弱い犬ほどなんとやら

754 :デフォルトの名無しさん:2020/03/03(火) 21:53:18 ID:BC6YzT5m.net
本題ではない瑣末wなことに拘るねえ、延々と。その動機がわからん
そう言うことだよ、皮肉屋さん

755 :デフォルトの名無しさん:2020/03/04(水) 00:47:20 ID:Hp65i7gp.net
煽るわけじゃないけどさ、シェル芸してる人って
アルゴリズムと呼べるようなコードを書ける人が少ない気がする

スクリプト言語で用意されてる便利な関数は使えても
その関数を自分で実装することはできないレベル
C言語で簡単な設定ファイルのパーサーも作れなさそう

756 :デフォルトの名無しさん:2020/03/04(水) 01:10:12 ID:nNNW6i++.net
>>733
Ruby で言えば、

require './file' は、カレントディレクトリからの相対パスだけど、
require_relative './file' は、現在のファイルからの相対パスになる

つまり、require_relative './file' は、__dir__ + "/file"

__dir__ は、現在のソースファイル(__FILE__)のあるディレクトリ名を、正規化された絶対パスで返します。
シンボリックリンクも解決されます

757 :701:2020/03/04(水) 01:34:09 ID:nNNW6i++.net
>>732
Ruby の、OptionParser では、
-e オプションがあっても、-h オプションの引数、elp と解釈される

require 'optparse'

ARGV.replace %w(-help)

opts = { }
ARGV.options do |o|
o.on( "-e 引数", "引数" ) { |x| opts[ :e ] = x }
o.on( "-h 引数", "引数" ) { |x| opts[ :h ] = x }

o.parse!
end

p opts #=> {:h=>"elp"}

758 :デフォルトの名無しさん:2020/03/04(水) 02:42:11.83 ID:NN2zD8QV.net
知恵袋の最後の方で回答している気でいる雑種かな

759 :デフォルトの名無しさん:2020/03/04(水) 05:44:22.12 ID:aHZx5rgw.net
>>755
シェル芸ってなんの話?

760 :デフォルトの名無しさん:2020/03/04(水) 08:01:55.10 ID:1RejiZvB.net
>>759
qiitaとかtwitterでシェル芸で検索するとわかるよ
難読化(笑)とか意味のないことを一行でやったすげーとか言ってる連中

シェルスクリプトにもプログラムを書くのに必要な機能はあるのに
一行(シェル芸)で書くか、さもなければ他の言語のライブラリを使うしかないって考えてる連中

シェルスクリプトで一行で書けなければ、他の言語を使って数行かけて書くが
そもそもシェルスクリプトで数行書けば、他の言語より短く実現できたりするのに
アルゴリズムを書く能力がないからそれができない。そういう奴らが好きな言葉がシェル芸

目的の機能がないと何も出来ない。プリミティブな機能を使って実現する思考能力が欠けている

761 :デフォルトの名無しさん:2020/03/04(水) 08:06:58.23 ID:Eb7SAM7+.net
このスレでのだろう
自分がただ嫌悪しているのをいきなり表明されても

762 :デフォルトの名無しさん:2020/03/04(水) 08:12:50 ID:1RejiZvB.net
新しい話題を始めただけやで

763 :デフォルトの名無しさん:2020/03/04(水) 11:31:06 ID:8C7aLz+2.net
一般論だが
目的が解決できれば解決策は簡単な方がいい
シェルスクリプトで一行で書けるのならそれにこしたことはない
シェルスクリプトだと処理の限界もあらかじめ分かっているというおまけつき

764 :デフォルトの名無しさん:2020/03/04(水) 11:53:24 ID:nNNW6i++.net
シェル芸は、Software Design で、上田隆一が連載しているものだろ。
次回で連載終了だけど

たいてい、awk を使う

765 :デフォルトの名無しさん:2020/03/04(水) 15:48:52.99 ID:Tzh2DSUj.net
>>764
シェルスクリプトでプログラミングしないなら
「POSIXコマンドプログラミング」って改名したほうが良いと思う
awkプログラミングでもいいけどなw

シェル(CLIから実行するもの)とシェルスクリプト(.shファイルにまとめたもの)と
厳密に区別してるならいいけど、実際にはシェルスクリプトの中でシェル芸してるんだよなw

例えばRubyなんかでも外部コマンドを呼び出せるわけでRubyのなかでシェル芸もできる。
これをRubyコードと呼べるかというと疑問がでるだろう?それと同じ。

>>763
> 目的が解決できれば解決策は簡単な方がいい
という条件からすると、Rubyのなかでシェル芸するのが正解なパターンは結構多いと思う。
でもやらないことの方が多いだろう。理由はなんだろうか?処理速度かな?
その理由と同じものが、シェルスクリプトにも当てはまると思う。
つまり(Rubyの場合と同様に)シェルスクリプトの中でシェル芸すんな(笑)

> シェルスクリプトだと処理の限界もあらかじめ分かっているというおまけつき
一行では書けなくても、数行書けば実現できることも多い。
シェル芸しかできないから、一行で書けなければムリと諦めてる奴が多い。
たとえばRubyだと1行でできることが、C言語だと数行かかることは多いが、
それを「C言語の限界」と言うやつはいないだろう。だけどシェルスクリプトだと
それをシェルスクリプトの限界だと言う。単に自分の力の限界なだけなのにな。

766 :デフォルトの名無しさん:2020/03/04(水) 16:11:16.83 ID:nkrxx/zT.net
>>765
> 単に自分の力の限界なだけなのにな。

うむ、納得

767 :デフォルトの名無しさん:2020/03/04(水) 16:14:02.93 ID:yiNVycVp.net
ロジックが整理されておらず
バグが多数潜んでるシェルスクリプトかのような長文

言語が考え方に影響を与えることが分かるいい例だな

768 :デフォルトの名無しさん:2020/03/04(水) 16:37:48.08 ID:Tzh2DSUj.net
>>767
理由が書いてない、説明がまったくないので同意しないw
自分が思ったことつぶやいただけだな

769 :デフォルトの名無しさん:2020/03/04(水) 18:50:02.63 ID:RW1/oxrb.net
いちゃもんつける(自分のストレス発散)のが目的なもんだから
段落ごとの方向性がバラバラでつながりが無い/意味不明な文章

770 :デフォルトの名無しさん:2020/03/04(水) 19:11:58.65 ID:Tzh2DSUj.net
というレスはイチャモン以外の何物でもないけどなw

771 :デフォルトの名無しさん:2020/03/04(水) 23:41:25 ID:ito9Fws2.net
>>733
. inc.sh
にすればPATHから探す

772 :デフォルトの名無しさん:2020/03/04(水) 23:48:29 ID:NdgTFoKb.net
>>771
PATHから探したいんじゃないぞ

773 :756:2020/03/05(木) 00:24:52.81 ID:PBcHTAfh.net
>>756
に書いてある

つまり、カレントディレクトリからの相対パスではなく、
このファイルからの相対パスになる

だから、このファイルがあるディレクトリの絶対パスを求めて、
それに相対パスを加えるとよい

774 :デフォルトの名無しさん:2020/03/05(木) 00:25:52.24 ID:npHipiyQ.net
>>773
絶対パスってどういう意味で言ってる?

775 :デフォルトの名無しさん:2020/03/05(木) 01:35:06.58 ID:HPS3pF1O.net
>>758に納得してしまう

776 :756:2020/03/05(木) 04:40:53.09 ID:PBcHTAfh.net
>>756
に書いてあるけど、例えば、Ruby では、
script.rb に、スクリプトを書いてるとき、

p __FILE__
p __dir__

出力
"c:/Users/Owner/Documents/test/script.rb"
"c:/Users/Owner/Documents/test"

__FILE__ は、このファイルの絶対パス、
__dir__ は、このファイルがあるディレクトリの絶対パスを表す

だから、このファイルから見て、相対パス、./file なら、
__dir__ + "/file"

つまり、c:/Users/Owner/Documents/test/file

777 :デフォルトの名無しさん:2020/03/05(Thu) 07:57:16 ID:GG3NZ1nL.net
ただのガイキチか

778 :デフォルトの名無しさん:2020/03/06(金) 15:44:20 ID:el16gBAN.net
Rubyの人に質問するけど
Rubyでは引数処理に便利な機能って標準で提供されてるの?

779 :デフォルトの名無しさん:2020/03/06(金) 16:18:48.95 ID:dB1opsgL.net
すでに書かれてるだろ。自演か?w
興味あるならあれが標準かとか具体的なのは自分で調べろよ、もしくはRubyスレでだな

780 :デフォルトの名無しさん:2020/03/06(金) 23:22:42 ID:VrRz91DJ.net
>>779
Rubyのヒトは会話を装う自演なんて高等なことはできないぞw

781 :デフォルトの名無しさん:2020/03/06(金) 23:52:31 ID:uvQVOrPP.net
ようやくbashに慣れてきたけど最低限覚えとけって言語はなんだろうか
頻繁に使うのはsed・awk・grep程度なんでやるならperlの方がいいのかね
今後のためにpythonをと言われても素人に使う機会ないわ

782 :デフォルトの名無しさん:2020/03/06(金) 23:59:29 ID:dfpAZ0dm.net
>>781
素人に使う機会がある
機能、用途を教えてくれないか?

783 :デフォルトの名無しさん:2020/03/07(土) 00:00:23 ID:z518jRtl.net
>>778
ARGV, ARGFが組み込み、OptionParserが標準添付ライブラリで提供されてる

ARGVは配列に引数が入ってるやつでだいだいどの言語にもあるやつ
ARGV[0]が実行コマンドじゃなく1つ目の引数になってるのが微妙に使いやすい

ARGFは引数でファイル名を受け取る場合と
標準入力でファイルを受け取る場合を1つの処理で書ける便利なやつ
Ruby以外では見たことない

OptionParserはショートオプション/ロングオプション/サブコマンドとかをサポートしてて
getoptやgetoptsに比べれば書きやすいし便利ではある
ただもっと高機能なgemもあるので依存性とのトレードオフでライブラリを選ぶ感じ

総じて簡単には書けるんだけどPerlなんかに比べるとインタプリタの起動が超遅いから
コマンド叩いてから処理が終わるまでの時間が比較的長い場合にしか使わない

784 :デフォルトの名無しさん:2020/03/07(土) 10:41:41 ID:EQxW6/Yc.net
>>780
どうだろう?w

785 :デフォルトの名無しさん:2020/03/07(土) 13:57:14 ID:wqSODED6.net
if文でディレクトリの権限を確認するにはどうしたらいいですか?
-wをやってみたのですがうまく動作してくれません。
ファイルにしか使えないのですかね?

786 :デフォルトの名無しさん:2020/03/07(土) 19:03:29.05 ID:Tac4Jm8B.net
rootだからじゃね?いちおう対象がディレクトリも-wで書き込みの可否は返してるけど

787 :デフォルトの名無しさん:2020/03/07(土) 22:08:31 ID:wqSODED6.net
>>786
動作としては書き込み権限の有無を確認し、無ければ付与するという動作が作りたかったです。
いろいろ調べたところrootだとパーミッションを無視するらしいので、
if [ ! -w ディレクトリ ]
上記の記載をしているスクリプトの実行ユーザがrootの為、全てにおいて書き込み権限があると認識されてしまっていると考えられます。

788 :デフォルトの名無しさん:2020/03/07(土) 23:54:32 ID:hanAtv/p.net
「chmod ディレクトリ」で検索!

789 :デフォルトの名無しさん:2020/03/08(日) 00:08:43 ID:rfEr1WGY.net
>>788
chmodでディレクトリの権限を000にしても可能でしたが…

790 :デフォルトの名無しさん:2020/03/08(日) 00:50:11.68 ID:TYqtbVyi.net
パーミッションチェックじゃなくて書き込みができるか?だったはず

791 :デフォルトの名無しさん:2020/03/08(日) 02:47:35 ID:rfEr1WGY.net
>>790
そうなのですね。
それであれば、000にしてもrootは書き込み可能だから毎回書き込み権限が付与されないは正しい挙動ですね。
実行ユーザーを一般ユーザーに変えるか、lsの結果にwの文字があるかを判別する処理に変えるが対処法になりそうですね。

792 :デフォルトの名無しさん:2020/03/08(日) 03:12:50 ID:P20sq25k.net
>>791
そう、思い出した。ファイルのパーミッションを自分から読み書きできないように変更して
本当に読み書きできないか、-wや-rでチェックするコードを書いたら、rootの場合は
それが上手くいかなかった。だからrootではそのチェックをしないようにした。

793 :デフォルトの名無しさん:2020/03/08(日) 05:16:19 ID:Xv2JcybJ.net
rootの場合でも対象に書き込めるんだから真っ当な動作だわな

794 :デフォルトの名無しさん:2020/03/08(日) 12:36:43 ID:uLLaNXsz.net
rootが「一見書き込めない」ファイルは存在しうるけど
「書き込む許可をどうしても得られない」ファイルはシステムの不具合でもない限り存在しないからね。
じゃなきゃそのファイルを誰が処理するのかって話になる。

UID 0は自分が持ち上げられない岩は作れないのだ。

795 :デフォルトの名無しさん:2020/03/08(日) 19:11:47.52 ID:RzwfZ5D7.net
Read onlyでマウントしたのはボリュームはrootでも書き込めないよね。そもそも書き込めないメディアも
あくまでも-wは書き込めるかの判定だから使う側が勘違いしてるだけで判定としてはrootでも全く正常な動き

796 :デフォルトの名無しさん:2020/03/08(日) 19:58:45 ID:T8rZAzyK.net
cd -Lの-Lってデフォルト?

797 :デフォルトの名無しさん:2020/03/08(日) 20:25:40.77 ID:kizyo8RY.net
デファクトでデフォルト

798 :デフォルトの名無しさん:2020/03/08(日) 22:45:41.68 ID:rfEr1WGY.net
>>795
スクリプトを一般ユーザーで実行した際に書き込み権限があるかを判別するって認識でいいんですかね?
rootだと基本全部書き込めるから、一般ユーザーくらいでしか機能しない処理のような気がします。

799 :デフォルトの名無しさん:2020/03/08(日) 23:08:52.65 ID:5CM70Uar.net
単に現在(のユーザで)書き込めるかどうか判別してるにすぎないざね。権限とかは置いておいて。書き込める=書き込める権限と言うのならそうかもしれんが

ちなみに、macOSだとロックというのがあり、ロックするとrootでも書き込めないよう
権限とかではなくて単に書き込めるかどうかだな。Read onlyでrootで書き込めないのもそうだし
権限を調べたいならrootではなくてだろうね。もしくは詳しく権限を調べるとか

800 :デフォルトの名無しさん:2020/03/09(月) 01:15:25.69 ID:EmgiRGOf.net
>ちなみに、macOSだと〜
macOSというかBSDだな。FreeBSD/OpenBSDにもあった、そして挙動が同じ

801 :デフォルトの名無しさん:2020/03/09(月) 08:15:32.71 ID:nSyyVcXg.net
>>798
> 一般ユーザーくらいでしか機能しない処理のような気がします。

逆じゃね?w
rootくらいでしか問題にならないでしょ

rootでなんか普通使わねーw

802 :デフォルトの名無しさん:2020/03/09(月) 15:04:18 ID:rWRx//dL.net
PWDってさ、スクリプト実行前に設定されるって思う?

803 :デフォルトの名無しさん:2020/03/09(月) 15:50:41.07 ID:sbrbbxpE.net
されてないシェルなんてあったらそのシェルのバグだろう

804 :デフォルトの名無しさん:2020/03/09(月) 16:01:54 ID:sbrbbxpE.net
いや、どいつもこいつも設定しないのか。意外だな
PWD
This variable shall represent an absolute pathname of the current working directory. It shall not contain any filename components of dot or dot-dot. The value is set by the cd utility.
> The value is set by the cd utility.
まんまなのか(?)

805 :デフォルトの名無しさん:2020/03/09(月) 16:26:06 ID:sbrbbxpE.net
いや、スクリプトファイルの実行時にならされる、-c のコマンド羅列文字列の実行時にはされないかな?

806 :デフォルトの名無しさん:2020/03/09(月) 18:07:49 ID:bHKN7jy6.net
どのシェルも設定されるなーって思ってたらkshはされんかった
export $PWD=aaaってやって
ksh -c 'echo $PWD'したらaaaってでた

807 :デフォルトの名無しさん:2020/03/09(月) 18:10:56.70 ID:bHKN7jy6.net
-cだけじゃなくてksh a.shってやってもaaaってでたw
最初、echo $PWDの前に確認のためにpwdコマンドやっていて気づかんかった
kshだとpwdやったらPWDも設定されたw

808 :デフォルトの名無しさん:2020/03/09(月) 18:14:17.37 ID:bHKN7jy6.net
おぉ? kshだとcd .してもPWDは設定されんかったぞw
流石に別ディレクトリに移動したら設定されるが

809 :デフォルトの名無しさん:2020/03/09(月) 18:33:20.75 ID:6JwbfpR0.net
しまった。>>804,805は -c で " で括ってた。そりゃあ...すまん

kshも設定されない?(??)
export HOGE=hoge
export PWD=hage
ksh -c 'echo $PWD $HOGE'
ってやったら、(pwdの) hoge かな。バージョン違いかな? うちのは 93u+

810 :デフォルトの名無しさん:2020/03/09(月) 18:39:14.18 ID:bHKN7jy6.net
面白いなw
export PWD=aaaってやって以下のスクリプトを実行したら

echo $PWD # aaa
echo $(echo $PWD) # /home/ore
echo $PWD # /home/ore
ってなった。

どこで設定してるんだよwww
kshは93u+

811 :デフォルトの名無しさん:2020/03/09(月) 18:40:22.34 ID:6JwbfpR0.net
>>808
どういうテストなのかわからんけど、93u+ ではこんなん
$ cd /home
$ echo $PWD
/home
$ PWD=hoge
$ echo $PWD
hoge
$ pwd
/home
$ echo $PWD
hoge
$ cd .
$ echo $PWD
/home

812 :デフォルトの名無しさん:2020/03/09(月) 18:40:35.23 ID:bHKN7jy6.net
echo実行後にせってされてるのでは?と思う人のために

echo $PWD # aaa
echo $PWD # aaa
echo $(echo $PWD) # /home/ore
echo $PWD # /home/ore

813 :デフォルトの名無しさん:2020/03/09(月) 18:41:47.16 ID:6JwbfpR0.net
>>810
同じか。ナゾだなw

814 :デフォルトの名無しさん:2020/03/09(月) 18:42:40.76 ID:bHKN7jy6.net
>>811
あ、kshに入ってから実行してるわけじゃないよ
bashからksh -c とか ksh a.sh とかしてる

ksh上でやってるならプロンプト表示する処理の
どこかで設定されてるのでは?

815 :デフォルトの名無しさん:2020/03/09(月) 18:45:40.99 ID:bHKN7jy6.net
echo $PWD # aaa
:
echo $PWD # aaa

-----

echo $PWD # aaa
$()
echo $PWD # aaa

-----

echo $PWD # aaa
$(:)
echo $PWD # /home/ore

サブシェルに入ってから?なんか実行すると設定されるっぽいw

816 :デフォルトの名無しさん:2020/03/09(月) 18:46:18.77 ID:6JwbfpR0.net
$ ksh -c 'PWD=hoge;echo $PWD;cd .;echo $PWD'
でも、
hoge
/home
かな

817 :デフォルトの名無しさん:2020/03/09(月) 18:48:20.68 ID:bHKN7jy6.net
つまりkshで安全に$PWDを使うためには
最初の方で$(:)を実行しておけってことだなw
これが最速の方法か知らんけど、pwd > /dev/null よりかは速そう。いやどっちだろ?

818 :デフォルトの名無しさん:2020/03/09(月) 18:50:28.04 ID:bHKN7jy6.net
bashでログインして、cd /homeして

ksh -c 'PWD=hoge;echo $PWD;cd .;echo $PWD' を実行すると
hoge
/home
ってでる

export PWD=hoge
ksh -c 'PWD=hoge;echo $PWD;cd .;echo $PWD' を実行すると
hoge
hoge
ってでる

819 :デフォルトの名無しさん:2020/03/09(月) 18:51:54.13 ID:bHKN7jy6.net
ははは、ワロスワロス。どうなってるのか考えたら、頭がこんがらがってきたw

820 :デフォルトの名無しさん:2020/03/09(月) 18:55:32.91 ID:6JwbfpR0.net
なるほど
PWDがexportされていたかに影響するのか、イミフだな
exportされてるされてないで、pwdでのPWDも動作違う(?)

821 :デフォルトの名無しさん:2020/03/09(月) 19:04:32 ID:bHKN7jy6.net
PWDはデフォルトでexportされてるはずだから

cd /home
PWD=hoge
ksh -c 'PWD=hoge;echo $PWD;cd .;echo $PWD'

これも
hoge
hoge

822 :デフォルトの名無しさん:2020/03/09(月) 19:05:54 ID:bHKN7jy6.net
ムリw バグっぽいけど、どういうバグなのか頭が働かないw

823 :デフォルトの名無しさん:2020/03/09(月) 19:11:00 ID:bHKN7jy6.net
スクリプトの中から
さらにksh -c 'echo $PWD'してもPWDはaaaのままだたけど
(echo $PWD)するだけで/homeになるな。
つまりサブシェルを使うと、サブシェルの外のPWDの状態が変化する

824 :デフォルトの名無しさん:2020/03/09(月) 19:20:17.23 ID:6JwbfpR0.net
うむ、PWDをイジるとね

>>809のも
export HOGE=hoge
export PWD=hage
ksh -c 'echo $PWD $HOGE'

ログインして(シェルはbash)すぐ実行だと、
/home/ore hage
ログインして(bash)、cd /home した後だと、
hage hoge
だな。まずイミフ。PWDなんてイジらない(そもそもkshを好んで使わないwそういういOSがあるらしいが知らんw)から忘れようw

825 :デフォルトの名無しさん:2020/03/10(火) 00:15:26 ID:oWfapBN9.net
files="/Users/aaa/Documents/*"
for filepath in $files;
do
case $filepath in *.txt)
echo $filepath
esac
done

このcaseをifに置き換えた場合がうまくできません
ご指導よろしくお願いします

826 :デフォルトの名無しさん:2020/03/10(火) 00:18:49 ID:Cf5scsdy.net
forからやり直して下さい

827 :デフォルトの名無しさん:2020/03/10(火) 00:20:14 ID:QrvPekFm.net
caseでいいやん?なんでifに置き換えるのさ。意味ない。

828 :デフォルトの名無しさん:2020/03/10(火) 06:34:25 ID:fD+LS7Hr.net
単に拡張子を判断したいってだけじゃね。それも txt 一つだけとか。だとしたら、
if [ "${filepath##*.}" = "txt" ]; then
echo "$filepath"
fi
とかにしたくなるのもわからないでもない

829 :デフォルトの名無しさん:2020/03/10(火) 08:08:24 ID:oWfapBN9.net
>>827
勉強中でどうすればいいかわからなくて色々試してる最中です
if [[ $filepath = *.txt ]]; then
[[]]としたら出来ました
files="/Users/aaa/Documents/*.txt"
こうしたらcaseもifも不要でシンプルに出来ました
>>828
勉強になります。ありがとうございます

830 :デフォルトの名無しさん:2020/03/10(火) 10:13:09.27 ID:KDNpqv0e.net
>>828
なんでそんなにifにこだわるんだろうかね

if [ "${filepath##*.}" = "txt" ]; then
case $filepath in *.txt)
if [[ $filepath = *.txt ]]; then

どれがシンプルかは比べてみれば明らかだろうに

caseはcase一つで実現しているが、ifは別途 [ または [[ を
組み合わせてるから無駄な処理を行ってるんだが
文字数も長いし、[[はbash依存

パターンマッチングをcaseからifに置き換えても
文字を長くして無駄な処理を行って動くシェルを減らしているだけで
メリットが一つもない

831 :デフォルトの名無しさん:2020/03/10(火) 16:38:10.67 ID:HVuW4BfF.net
一つだけなのにcaseを使うのが気持ち悪い、判断パターンをcaseの後に書くのが気持ち悪いという感性の問題だな
どの感性が良い悪いというのではく。コーディング規約が一つにならないのと同じような
お前は俺のコーディング規約が絶対と言って譲らないのと同じ

832 :デフォルトの名無しさん:2020/03/10(火) 22:41:26.01 ID:DGocRqod.net
コーディング規約と漠然にいってるけどその内容には二種類あって、
一つは「理由がある良いやり方」と
もう一つは「どちらでも良いけど統一しましょう」というだけのもの

理由があるものはどちらが良いか明確に言うことができる。
明確に言えないものはインデントのスペースを2にするか4にするかという
統一だけするもの。コーディング規約にはこの二つが混じっているから、
良いか悪いかの話ができるものまで、好みの話だと勘違いしてる。

感性が邪魔して良い方法を採用することが出来ないという気持ちはわかるが
今回は明らかにcaseを使ったほうが良い。他にifの方がいい理由があれば
トレードオフの話に持っていけるが

833 :デフォルトの名無しさん:2020/03/11(水) 02:59:38.62 ID:nI7VA1ob.net
しつこい

834 :デフォルトの名無しさん:2020/03/11(水) 03:56:24.84 ID:arwb9WsV.net
俺様が決めたコーディング規約に従えねぇってかごるぁ
ということを言いたいんだろうな。caseは正義なんだと。

835 :デフォルトの名無しさん:2020/03/11(水) 04:45:38.32 ID:ZeFz9OTM.net
承認欲求のひとつだろな

836 :デフォルトの名無しさん:2020/03/11(水) 09:22:15.60 ID:FWSDJbu9.net
>>834
コーディング規約の話なんかしてないだろ?
この場合は、caseの方が優れてるのに
ifを使いたいという"感性"を持ち出してきたアホが居るだけ
そのアホがコーディング規約がーとか意味不明なことを言ってるだけ

837 :デフォルトの名無しさん:2020/03/11(水) 09:32:31.50 ID:FWSDJbu9.net
この場合はcaseが優れてるね

case使えって言った!こいつどんなときでもcase使えって言った!
理由はコーディング規約だからそれに従えだって!


誰もそんなこと言ってないんだよなぁ(笑)
なんで優れてるかどうかの話をすり替えたんだろうね

838 :デフォルトの名無しさん:2020/03/11(水) 09:35:24.46 ID:arwb9WsV.net
>>836-837
>>833読んだ?

839 :デフォルトの名無しさん:2020/03/11(水) 10:04:34.79 ID:FWSDJbu9.net
>>838
自分がしつこいから、レスが来てるって思わない?w

840 :デフォルトの名無しさん:2020/03/11(水) 10:35:05.80 ID:9AoZOnAU.net
>>829を読むとcaseもifも使わないでシンプルに出来たと言っていて、本人はifになんか全然拘っていないんだよな。何故か勝手にしつこく敵視してる笑。

841 :デフォルトの名無しさん:2020/03/11(水) 10:40:57.60 ID:FWSDJbu9.net
敵視してるのは>>831だぞw

842 :デフォルトの名無しさん:2020/03/11(水) 15:58:19.41 ID:6PQL09wH.net
これがアスベというのだな

843 :デフォルトの名無しさん:2020/03/11(水) 18:51:36.11 ID:6kL2fYSe.net
無駄なcat的な何か

844 :デフォルトの名無しさん:2020/03/14(土) 09:40:09 ID:H7XbSJpX.net
知らんかったけど、こんな書き方できるんやな

cat << HERE |
abc
HERE
sed s/a/b/g

cat <<HERE &&
abc
HERE
echo abc

謎な書き方多すぎw

845 :デフォルトの名無しさん:2020/03/14(土) 09:44:21 ID:H7XbSJpX.net
cat <<HERE && cat<<HERE
aaa
HERE
bbb
HERE

わろたw
これも動くんだ

846 :デフォルトの名無しさん:2020/03/14(土) 11:50:07.06 ID:9+oeBXql.net
zshだとOKだけどbashだけど文法エラーになるものってあるかな?

例えばbashだとOKだけど、shでは文法エラーになるものに配列がある。

$ bash -cn 'a=()'
$ sh -cn 'a=()'
sh: 1: Syntax error: "(" unexpected

これのzsh版

847 :デフォルトの名無しさん:2020/03/14(土) 11:52:32.93 ID:9+oeBXql.net
ただしこれは除く

$ bash -cn 'foo() :'
bash: -c: 行 0: 予期しないトークン `:' 周辺に構文エラーがあります
bash: -c: 行 0: `foo() :'

これはshでは通る。POSIX準拠の構文なはず。だけどbashが通らない珍しい例
$ sh -cn 'foo() :'

848 :デフォルトの名無しさん:2020/03/14(土) 15:19:53 ID:4q4RZYWz.net
環境はMac mojave、lsとecho $(ls)とで挙動が違うのってなんででしょうか
前者はスペースや改行がしっかりされてるんですが後者は整形されませんでした

849 :デフォルトの名無しさん:2020/03/14(土) 15:51:10.82 ID:ILPzjwAA.net
lsは出力先によってオプションを指定しない場合のdefault formatが変わる
そういう仕様

850 :デフォルトの名無しさん:2020/03/14(土) 16:50:55 ID:cW1wo+Y7.net
>>848
echoなんぞに引数で渡す場合は、引数として渡すために分割されてるからじゃね。逆に整形されてるとも言える
echo "$(ls)"
(IFS=''; echo $(ls))
だと同じくならなくね?

851 :デフォルトの名無しさん:2020/03/14(土) 17:16:06 ID:aw8SOrjK.net
>>848
echoは複数の引数を(IFSの値とは関係なく)
スペースで区切ってくっつけるという仕様だから

852 :デフォルトの名無しさん:2020/03/14(土) 17:30:36.50 ID:ILPzjwAA.net
$ echo "$(export COLUMNS=159; export CLICOLOR_FORCE=1; ls -C)"
これでlsだけの時と同じ出力になった

853 :デフォルトの名無しさん:2020/03/14(土) 17:34:32 ID:aw8SOrjK.net
それは一つの引数の中に改行があるからな

別の問題として最後に複数の改行があっても一つにまとまるから
厳密には同じではない

854 :デフォルトの名無しさん:2020/03/14(土) 17:48:52 ID:Qg6b8RMl.net
なにいってるの

855 :デフォルトの名無しさん:2020/03/14(土) 17:52:54 ID:aw8SOrjK.net
正しいことを言ってる

856 :デフォルトの名無しさん:2020/03/14(土) 17:55:17 ID:Qg6b8RMl.net
変わったやつなのはわかった

857 :デフォルトの名無しさん:2020/03/14(土) 17:56:25 ID:aw8SOrjK.net
教えてほしいなら、何を教えればいいか具体的に言おうねw
質問者のくせに

858 :デフォルトの名無しさん:2020/03/14(土) 17:58:01 ID:Qg6b8RMl.net
おかしなやつだったか

859 :デフォルトの名無しさん:2020/03/14(土) 18:01:56.55 ID:aw8SOrjK.net
まーた始まった

860 :デフォルトの名無しさん:2020/03/14(土) 18:20:00 ID:tUDMKnWI.net
お前がな

861 :デフォルトの名無しさん:2020/03/14(土) 21:45:32.98 ID:fgvgQcum.net
>>844
その仕様は Perl にも受け継がれてるよ。

862 :デフォルトの名無しさん:2020/03/14(土) 23:56:32.86 ID:9VuyfYoc.net
echo は、連続した空白を、1つにまとめる

863 :デフォルトの名無しさん:2020/03/15(日) 00:05:16.78 ID:7lggs81n.net
$ echo " foo bar " " baz qux"
__foo__bar_____baz__qux

空白まとまらないけど、なんの話をしてるの?

864 :デフォルトの名無しさん:2020/03/15(日) 00:13:30 ID:1+6iz56B.net
$ echo " foo bar " " baz qux"
_foo_bar___baz_qux

って事を言ってるんじゃないかな

865 :デフォルトの名無しさん:2020/03/15(日) 00:16:12 ID:1+6iz56B.net
あららw "_" をスペースに読み換えて頂戴

$ echo " foo bar "_____________" baz qux"
_foo_bar___baz_qux

866 :デフォルトの名無しさん:2020/03/15(日) 01:09:56 ID:7lggs81n.net
マジか!?
それechoとは関係ないよね

867 :デフォルトの名無しさん:2020/03/15(日) 03:22:11.24 ID:DhvkTO6y.net
やってるのはシェルだよな

868 :デフォルトの名無しさん:2020/03/15(日) 09:50:54 ID:4Gm4pJRZ.net
せっかく俺が、複数の引数をっていってんのに

869 :デフォルトの名無しさん:2020/03/15(日) 10:12:42.77 ID:IC7rc7YS.net
>>862はいつものRuby君だろ。相変わらずデタラメを垂れ流してるな。

870 :デフォルトの名無しさん:2020/03/15(日) 12:24:19.50 ID:ekOFLY9+.net
exprの正規表現関連の機能って便利だな。
恥かしながらPOSIXで定義されているとは思わず,
ずっとBash拡張だと思って利用を避けてきてたわw

sedだと変数の値に対しての操作が一発でできない(printf '%s' "$var"なんかを噛ませないといけない)
から、「変数に対して,指定した位置の文字を抜きだす」くらいの単純作業なら,
sedよりexprで処理した方がコマンドの個数も少なくなるし,よさげ。

871 :デフォルトの名無しさん:2020/03/15(日) 13:45:49 ID:4Gm4pJRZ.net
>>870
exprは外部コマンド、bashとは無関係
sedで変数もうさも、sedの代わりにexprも意味がわからない。
使い方が違うコマンド

872 :デフォルトの名無しさん:2020/03/15(日) 17:46:54 ID:ekOFLY9+.net
>>871
Bashとは無関係とはいっても
echoみたいにPOSIXでは「外部コマンド」とされてるけど
Bashでは組み込みコマンドで,かつ独自の拡張機能が備わっている。
みたいな場合も考えられる。

873 :デフォルトの名無しさん:2020/03/15(日) 20:32:36 ID:LgQopvr+.net
>>872
/bin/exprで使えばええ

874 :デフォルトの名無しさん:2020/03/15(日) 21:16:13 ID:ekOFLY9+.net
>>873
いや,別に「外部コマンドとしてのexprが使いたい」なんて言ってない。

875 :デフォルトの名無しさん:2020/03/15(日) 21:39:15.64 ID:UEcfE5Ac.net
伝わらなくてもどかしそうw

876 :デフォルトの名無しさん:2020/03/15(日) 22:09:22.92 ID:7377Zo4Z.net
>>872
exprがビルトインになってるシェルは存在しない

877 :デフォルトの名無しさん:2020/03/15(日) 22:19:50 ID:GTp/Qp/S.net
exprぐらいシェルのビルトインになっていてもおかしくない。ある意味思い込み
exprの正規表現関連はbashの拡張だと思っていた。exprがbashのビルトインしくはbashのオマケ外部コマンドなのが必須=完全な思い込み
というだけだろ。言いたいことはそこじゃないだろに、読み取ってやれよw

878 :デフォルトの名無しさん:2020/03/15(日) 22:24:16 ID:GTp/Qp/S.net
「Bash拡張」ではなく「GNU拡張」なんぞに置き換えればいいだけだな

879 :デフォルトの名無しさん:2020/03/15(日) 22:30:33 ID:7377Zo4Z.net
>>877
だからbashの拡張だと思っていたと言ってるから
そもそも外部コマンドだ。と言ってるだけなんだが

880 :デフォルトの名無しさん:2020/03/15(日) 22:35:36 ID:GTp/Qp/S.net
>>879
>>878

そこは蛇足
exprの正規表現関連はPOSIXじゃないと利用を避けてきたわ
で済むだけ。外部コマンドとか蛇足もいいとこな話だろう

881 :デフォルトの名無しさん:2020/03/15(日) 22:42:53 ID:7377Zo4Z.net
蛇足って話をするのなら、外部コマンドに反論すること自体が蛇足

そんなどうでもいいことじゃなくて、
sedでprintf '%s' "$var"とか言う意味不明な点を説明しろよ
変数の値に対しての操作が一発でできないのは「外部コマンド」ならどれも一緒だろ

882 :デフォルトの名無しさん:2020/03/15(日) 22:48:02.29 ID:GTp/Qp/S.net
思い込みの理由を述べただけと読んでやれよ。なんでそうも噛み付いているの?

sedにネタ元渡すためにはとかじゃないの?echoでもいいんじゃないの?ソコは
exprは対象を引数として渡せるぐらいの意味、動作及び返り値が単純だから変数をちょっとイジるくらいならsedよりもって話じゃないの。俺はそう読み取ったけど

なんでそうも強く噛み付いているの?

883 :デフォルトの名無しさん:2020/03/15(日) 22:50:35.45 ID:7377Zo4Z.net
> なんでそうも強く噛み付いているの?

噛み付いてないけど?俺はexprは外部コマンドと言っただけ
それ以外のことを言ってない。
過剰に反応してるのはお前では?

884 :デフォルトの名無しさん:2020/03/15(日) 22:53:20 ID:GTp/Qp/S.net
蛇足なことが続くなと思ったからだけど。蛇足な理由を言っただけだけど?
>>881なんて明らかに噛み付いているだろうにw 特に後半とか。よく言うよ

885 :デフォルトの名無しさん:2020/03/15(日) 22:59:01 ID:7377Zo4Z.net
後半?これ?蛇足(bash拡張かどうか)じゃなくて本筋の話をしろとしか書いてないが?

> sedでprintf '%s' "$var"とか言う意味不明な点を説明しろよ
> 変数の値に対しての操作が一発でできないのは「外部コマンド」ならどれも一緒だろ

886 :デフォルトの名無しさん:2020/03/15(日) 23:07:40 ID:9BnnGhWf.net
無茶苦茶だなとしか言いようがない
で、その応えは>>882で納得したのかね?合っているのか知らんけど、俺は一応そうは読めたからなあ、「意味不明な点を[説明しろよ]」とか何様なんだか何噛み付いているのかとしか思えない

887 :デフォルトの名無しさん:2020/03/15(日) 23:29:41 ID:ekOFLY9+.net
えぇ……なんでそうも喧嘩腰なんですかね……。

888 :デフォルトの名無しさん:2020/03/15(日) 23:42:33 ID:9BnnGhWf.net
わからん...性かなww

889 :デフォルトの名無しさん:2020/03/15(日) 23:47:47 ID:LgQopvr+.net
こんな所でしか他人に相手にして貰えないからでしょ?

890 :デフォルトの名無しさん:2020/03/15(日) 23:50:43 ID:9BnnGhWf.net
読めなさそうな人はそうかもねw

891 :デフォルトの名無しさん:2020/03/15(日) 23:52:26 ID:Uvpryj8C.net
>>870 を読んだ限りでは
「そうか、誤解してたのか。でもその誤解はもう解けたんだな。」
くらいにしか思わないけどなあ。
知らないみたいだから教えてやろうみたいな考えにはならないけどなあ。

892 :デフォルトの名無しさん:2020/03/16(月) 05:03:15 ID:OSNWgEHh.net
シンタックスエラーになるのに、問題なく実行できる例

shopt -s expand_aliases
alias loop=for
loop i; do
 echo "$i"
done

だからなんだって言われても困るけどwww

893 :デフォルトの名無しさん:2020/03/16(月) 05:05:37 ID:OSNWgEHh.net
キーワードを全部置き換えれば対象可能かな?

shopt -s expand_aliases

alias loop=for
alias begin=do
alias end=done

loop i; begin
 echo "$i"
end

894 :デフォルトの名無しさん:2020/03/17(火) 01:19:59.84 ID:tnhbC/l2.net
まだ初歩的なシェルスクリプトしか書けないがbashで一番変態的な記法ってなによ
空白を入れないfoo=barの時点で妙だし配列が括弧だらけでマンドクセとは思うが

895 :デフォルトの名無しさん:2020/03/17(火) 02:44:04.56 ID:DZYZalLc.net
さあなぁ、シェルスクリプトのコマンド=外部コマンド
だからファイル名につけられる文字や名前はすべて外部コマンド名として許されるべきだろうから
そうすると、やたらとコマンドを増やすわけにはいかないんだよね。

ABC = 123 とか書くと、ABCコマンドがあったらどうするんだ!?ってなるわけで、
ABC=123という風にファイル名にイコール使わないんじゃね?という前提にした
という理由があるから、そうなってるのわかるしなぁ。

ABC[123]とかいう外部コマンドだって作ろうと思えば作れるし

${aaaなんとか}シリーズが多いのも、既存の文法の拡張だけでやりたいからだろうし、
理由がわかれば、なっとくできるからなぁ。

んで、シェルスクリプトではそれ以外の拡張はしづらい運命にあるから、
逆に変態的な記法ってないで。変態な記法を作ろうと思っても作れない。

896 :デフォルトの名無しさん:2020/03/17(火) 02:51:08.61 ID:DZYZalLc.net
シェルスクリプトの欠点?というわけでもないが、
仕様としてコマンド置換は最後に連続する改行が消えるから
var=$(func 1 2 3) みたいな形で、便利な関数を追加するのが
難しいんだよね。最後の改行が消えるから

いろんな機能が${varなんとか}の形で提供されてるのは、
これなら変数の代入だから最後の改行が消ないから

変態的な記法というならこれかなぁ、配列もそうだし
何でもかんでも${varなんとか}という形で機能拡張が行われてる
最近の ${parameter@operator} とかね

897 :デフォルトの名無しさん:2020/03/17(火) 14:49:49.69 ID:+LpQdzFa.net
>>896
連続する改行が消えるのは、個人的には寧ろありがたい(整形しなくて済む)のだけれど
正確な出力が要求される場合には(例えば元のデータを可能な限り復元するとか)
面倒な仕様かもね。

898 :デフォルトの名無しさん:2020/03/17(火) 20:33:42 ID:WZhpPu/2.net
>>894
かっこがコマンドであるという点かなあ

899 :デフォルトの名無しさん:2020/03/18(水) 01:29:14 ID:9x4eFjJt.net
>>894
関数を一行で書く時の空白と;が割と初見殺し
func(){ echo foo;}
波括弧が予約語なんで開き括弧の空白と閉じ括弧の;が必須
改行時は不要だから結構ハマったわ

900 :デフォルトの名無しさん:2020/03/19(木) 09:42:42.24 ID:+0MAARlE.net
exprについて教えてください。
現在tarで圧縮したファイルの末尾に数字をつける処理を使っています。
A=tarファイル名
B='expr = $A + 1'
tar czvf B 対象ファイル名
上の処理で実行すると、[整数でない引数]と表示されてしまい数字が付かないtarが出るのですが何故でしょうか。

901 :デフォルトの名無しさん:2020/03/19(木) 09:47:58.88 ID:YUAN2W2v.net
exprコマンドは廃止されました。
使ってはいけません。

902 :デフォルトの名無しさん:2020/03/19(Thu) 10:02:09 ID:QNV2kCYN.net
tarファイル名 が [整数でない引数] だからというその表示のまま
他にもツッコミどころがありすぎ

903 :デフォルトの名無しさん:2020/03/19(Thu) 10:09:58 ID:JDU05jIv.net
expr の四則演算は、整数しか使えないのかも。
こういう感じ

echo `expr 100 + 20`
#=> 120

まあ、expr で検索して!

904 :デフォルトの名無しさん:2020/03/19(木) 10:25:57.68 ID:YUAN2W2v.net
だからさぁ、整数の計算ごときで
expr使うなって

905 :デフォルトの名無しさん:2020/03/19(Thu) 11:40:21 ID:Ul0ojJdl.net
とりあえずでもいいだろ。俺は知ってるを押し付けすぎ

906 :デフォルトの名無しさん:2020/03/19(木) 12:30:37.63 ID:awkeHjZR.net
>>902
数字じゃないとダメってことですか?
調べたのですが、普通に同じような書き方でテキストファイルに数字つけてる方がいたので参考にしたのですが…。

907 :デフォルトの名無しさん:2020/03/19(Thu) 13:14:01 ID:JDU05jIv.net
文字列の連結なら、普通に続けて書けばよい

a=xyz
b=${a}11

echo $b
#=> xyz11

908 :デフォルトの名無しさん:2020/03/19(Thu) 14:30:55 ID:awkeHjZR.net
>>907
その例でいうと"11"が不明なのです。
tarを作成する際に同じ名前のtarがすでにあった場合は数字をつけたいんですよね。
すでに同一ファイル名があったら1をつける。
同一ファイル名1があったら2に変えるみたいな…。
名前の重複を避けたいのです

909 :デフォルトの名無しさん:2020/03/19(木) 15:05:23.65 ID:JDU05jIv.net
名前が重ならない、temp ファイルを使えば?
mktemp コマンドを利用して、ユニークな名前の一時ファイルを作成する

それか、ファイル名に、タイムスタンプを含めれば?

1 とか、2 を付けるのは難しい。
1があれば、2にして、
2もあれば、3にして、

こういうループは難しい

910 :909:2020/03/19(木) 15:12:34.38 ID:JDU05jIv.net
mktemp【コマンド】とは

https://wa3.i-3-i.info/word12124.html

911 :デフォルトの名無しさん:2020/03/19(木) 15:43:33.78 ID:A3B3oNfE.net
>>908
プログラミング的なスクリプトを書かないとだめだろう
通番をつけるのは今何がつけられていて
その中での最大が何でそれにプラス1するって処理が必要で
複雑になるから通番なしのものがあれば
日時入れるのが妥当なのではないかな

912 :デフォルトの名無しさん:2020/03/19(木) 15:44:22.95 ID:A3B3oNfE.net
ちなみにwgetであればオプションにもよるけど
ダウンロードしようとしてるファイルがすでにあれば
通番をつけるようになってるけどtarとかでは聞かない

913 :デフォルトの名無しさん:2020/03/19(木) 16:37:23.68 ID:Pzb6grX0.net
連番のH画像/動画を一気にダウンロードする7.5 [無断転載禁止]©2ch.net
http://mevius.5ch.net/test/read.cgi/unix/1459277070/

914 :デフォルトの名無しさん:2020/03/19(木) 18:00:54.20 ID:fgd/sgV0.net
ttps://qiita.com/tomiokario/items/a0b635d09995bb74503b

これを参考にしたのかな? まあ足してるの整数同士だけど。このまま試してみればいい
じゃん。ただ、機能するけどちょっと直さないと名前がおかしくなると思うたぶん。

915 :デフォルトの名無しさん:2020/03/19(木) 18:26:31.73 ID:A3B3oNfE.net
それとはちと違う
いや大幅に違う

916 :デフォルトの名無しさん:2020/03/19(木) 18:49:11.91 ID:CK8P50/C.net
ID:awkeHjZR が参考にしたのだろ
既存の最大の次でもない、単にあったら次だな、今までのレスからは
誰もが使うのだったら既存の最大の次の方が望ましいだろけど

917 :デフォルトの名無しさん:2020/03/19(Thu) 19:05:06 ID:CK8P50/C.net
ああ、最大にはなってるのか。いちおう
間に欠番があってはとか、というよりちょっとアレだなという、「大幅に違う」か(?)

918 :デフォルトの名無しさん:2020/03/19(Thu) 19:11:21 ID:CK8P50/C.net
あ、いや、やっぱ、あったら次なだけか
しつれい

919 :デフォルトの名無しさん:2020/03/19(木) 19:20:02.01 ID:awkeHjZR.net
>>914
それを参考にしました。
よく見たら整数通しでしたね。
申し訳ありません…

920 :デフォルトの名無しさん:2020/03/19(木) 22:46:59.86 ID:0V5Z+nsf.net
A=tarファイル名
B="$A"
if [ -e "$B" ]; then
e="${B##*.}"; [ "$e" = "$B" ] && e='' || e=".$e"
B="${B%.*}"

x=0
for f in "$B"*$e; do
v="$(expr "${f%.*}" : '.*[^1-9]\([1-9][0-9]*$\)')"
[ "$v" -gt "$x" ] 2> /dev/null && x=$v
done
B="$B$((x+1))$e"
fi
echo tar czvf "$B" 対象ファイル名

Aが存在しない場合はそのまま、存在する場合は連番付きの最大+1
Aは拡張子付いていてもいい
風な

921 :デフォルトの名無しさん:2020/03/19(木) 23:10:29.22 ID:0V5Z+nsf.net
Aに拡張子ない場合、 for直下に
[ "$e" = '' ] && [ "${f##.*}" = "$f" ] && continue
とか必要か
拡張子抜きの名前の最大の場合はこれはいらず
for f in "$B"*; do
でいいはず
拡張子無いのだけを抽出するGLOBってあったかな?

922 :デフォルトの名無しさん:2020/03/20(金) 01:41:19.99 ID:3O1eG+VM.net
exprでの正規表現がよくわからない
何処かまとめてある所はありませんか?

923 :デフォルトの名無しさん:2020/03/20(金) 06:24:37.20 ID:v4UpLchp.net
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/expr.html#tag_20_42_13_01
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03

正規表現 BRE
などとググればたくさん。お好きなとこを

924 :デフォルトの名無しさん:2020/03/20(金) 07:26:36.21 ID:MAPSjPan.net
>>923
問題はそれに従ってないものが多いw

925 :デフォルトの名無しさん:2020/03/20(金) 10:33:09 ID:AIrE4YMP.net
BREで動かないってどこのexpr?

926 :デフォルトの名無しさん:2020/03/20(金) 11:04:41.59 ID:Cf4Df32C.net
ユーザ名パスワード受け取って、シェルスクリプト内でloginさせるような使い方って普通?

docker login -n ユーザ名 -p パスワード
docker run イメージ
みたいな

927 :デフォルトの名無しさん:2020/03/20(金) 12:32:34.45 ID:VFfjvmrc.net
windowsはtempでLinuxはtmp派だと思ってたがmktempなんてあるのか

928 :デフォルトの名無しさん:2020/03/20(金) 15:01:17.57 ID:b2ihZgLg.net
>>926
そういうのはCredential Storeを使う

シェルスクリプトのことだけで言えば
echoさせずにパスワード入力させてそれをreadするのが普通
コマンドに渡すやり方だと最低でも履歴に残らないような対処が必要

929 :デフォルトの名無しさん:2020/03/20(金) 20:09:17 ID:Cf4Df32C.net
>>928
なるほど勉強になった
historyに残さない方法で行く

930 :デフォルトの名無しさん:2020/03/20(金) 22:01:17 ID:PR7Jj0ZL.net
>>925
そうじゃなくて、POSIXで正規表現が使えるコマンドは
expr、grep、awk があるが、例えば BREに対応と言いつつ
BRE以上のものにまで対応していて、どこまで対応してるのか
完全に一致しているのか改変されているのか、
拡張オプションが有るのか、バラバラと言うこと

931 :デフォルトの名無しさん:2020/03/20(金) 22:11:38 ID:AIrE4YMP.net
exprはBREだけだから関係ない話だな

932 :デフォルトの名無しさん:2020/03/21(土) 00:31:26.53 ID:aSsBDGSZ.net
本当に?

933 :デフォルトの名無しさん:2020/03/21(土) 09:14:24 ID:Nklv0DXu.net
>>927
Windows 10, WSL, Ubuntu 18.04 で、
which mktemp
/bin/mktemp

でも、一時ファイルのパーミッションが、700 になるなど、ややこしくて使えない!
単純にそのディレクトリ内で、ユニークなファイル名がほしいだけ

934 :デフォルトの名無しさん:2020/03/21(土) 10:15:51 ID:aSsBDGSZ.net
>>927
普通はmktempやろ

>>933
何がややこしいのかわからん。700で困るんか?
ディレクトリ内で、ユニークなファイル名が欲しいだけなら700で何も問題ないだろ
お前がパーミンションを理解してないだけ

935 :デフォルトの名無しさん:2020/03/21(土) 10:17:30 ID:HMPQgip5.net
できるけど

936 :デフォルトの名無しさん:2020/03/21(土) 10:24:42 ID:HMPQgip5.net
>>934
テンポラリを表す省略形のことだろ

そのディレクトリは/tmpではないとこじゃね。PWDとか指定したのとか。できるけど
ファイル名だけもらっても実際にはファイル作ってるけど。単に作った直後に消してるだけ、まあ問題になりそうにないけど
700が困るのはさっぱりわからんな

937 :デフォルトの名無しさん:2020/03/21(土) 11:01:46 ID:tuOdrSqm.net
ファイル作らずに(コマンド実行時点で)一意なファイル名が欲しいだけならオプション付きで実行すればいいだけじゃね?

938 :933:2020/03/21(土) 11:20:35 ID:Nklv0DXu.net
644 はよく見るけど、

700 はよく見るパーミッションじゃないから、困らないのかなと思って

939 :デフォルトの名無しさん:2020/03/21(土) 11:48:36.74 ID:tuOdrSqm.net
>>938
見たことあるものを見たことある方法でしか使えないお前は困るかもしれないが、普通の知識や技能のあるlinuxユーザは困らない。

940 :デフォルトの名無しさん:2020/03/21(土) 12:21:57 ID:HMPQgip5.net
>>937
mktemp内で一度フィルを作って、ファイル名だけくれのオプションだったらそれを消す
ということをしてるだけということね

>>938
644で言えば、6の部分がお前、44はお前じゃない誰か用
700で7がお前なんだから何も困らない、お前じゃない誰かが困るかもだがテンポラリなんてお前しか使わないだろ(700というより600だろ。ファイルでなくてディレクトリなら700だろけど)

941 :デフォルトの名無しさん:2020/03/21(土) 12:35:34 ID:HMPQgip5.net
00で困るような使い方(他に渡すとか)するにしてもお前のファイルなんだからchmodでも自分でしとけというとこやな

942 :デフォルトの名無しさん:2020/03/21(土) 13:00:59 ID:kuk28tWG.net
な?言ったとおりだっただろ?
↓>>938はパーミッションを分かってないだけだって

> 700 はよく見るパーミッションじゃないから、困らないのかなと思って

このパーミッションでOKかどうかっていうのは、
よく見るかどうかで決めるもんじゃないだろ
レビューでこのパーミッションはあまり見かけいないから困るだろ
とか指摘されたらぶっ○したくなるわw

943 :デフォルトの名無しさん:2020/03/21(土) 13:06:44 ID:kuk28tWG.net
昔ウェブサービスでユニークなファイルを作るべき処理で
オレオレで年月日時分秒とかのファイルにして
アクセス多数で重複ファイルがでてトラブった会社あったなぁw

mktempにファイルを作らせないと
真にユニークな名前なんて作れねーんだよ
もしくは頑張ってmktempと同等のことをするとかな
そのためにはmktempがなぜそうしているかの理由を調べないといけない

944 :デフォルトの名無しさん:2020/03/21(土) 13:42:32.99 ID:ys6caT0H.net
うちになんでもかんでもシェルスクリプトでやろうとする人がいるんですが
どうすればやめさせられますか?
GUI以外でシェルスクリプトでこんなことやるなっていうのを具体例付きでを教えて下さい
それを根拠に理論武装してあいつをぶちのめしてきますので

945 :デフォルトの名無しさん:2020/03/21(土) 13:55:11.55 ID:VWAuyUcc.net
自分もなんでもかんでもシェルスクリプトでできるような知識を持つことだな
そんな誰か頼りではなくて
なんでもかんでも自分でもできるがしないじゃないとぶちのめせないだろ

946 :デフォルトの名無しさん:2020/03/21(土) 14:08:20 ID:FH3PvP3D.net
>>944
シェルスクリプトではなくプログラミング言語を使った方がいいケースがこれまでにもあったということだろ。それならそのケースについて他の方法でやった方が良い理由を具体的に説明すればいいんでないの?

947 :デフォルトの名無しさん:2020/03/21(土) 14:33:14 ID:Nklv0DXu.net
x=x
a=
b=

if [ $a = $b ]; then # 構文エラーw
fi

空文字で構文エラーになるから、下のように双方に、1文字ずつ追加して比べるw
面倒くさい

if [ $a$x = $b$x ]; then
echo $a$x #=> x
fi

948 :デフォルトの名無しさん:2020/03/21(土) 17:00:58.81 ID:EuPu7JS3.net
単にシェルでのコマンドに引数を与える時の一般規則
xなどつけるのが嫌なら "で囲めばいいだけだろ

949 :デフォルトの名無しさん:2020/03/21(土) 17:17:50.80 ID:57M5Xw8A.net
>>947
[ "$a" = "$b" ]
とすればいいだけ。
ちなみに
a="("
b="("
↑みたいな一見展開されたらヤバそうな記号でも
引用符で囲んでやれば単なる文字列として解釈される。

950 :デフォルトの名無しさん:2020/03/21(土) 17:24:03 ID:He36jL2X.net
>>944
When to use Shell
https://google.github.io/styleguide/shellguide.html

951 :デフォルトの名無しさん:2020/03/21(土) 20:36:22 ID:57M5Xw8A.net
>>950
100行以上のシェルスクリプトを書くのはやめとけってことは
1行に1000文字くらい詰めて99行にしたらいいのかな?(難癖)

952 :デフォルトの名無しさん:2020/03/21(土) 21:07:17.99 ID:9LT6s2kW.net
# This gives a "too many arguments" error as f* is expanded to the
# contents of the current directory
if [ "filename" == f* ]; then
echo "Match"
fi
とかどういう層向けのなんだろな。なんか上にいるのと同じレベル向けとしか思えない
echo "filename" == f* ]
などとまったく同じなのに、[ ] が何か特別(スクリプト構文?)とでも思ってしまう割と最近始めましたな人用かと思ってしまうな

953 :デフォルトの名無しさん:2020/03/21(土) 22:20:10 ID:ys6caT0H.net
>>947
引数は""で囲むのは常識。shellcheckでも指摘される。

954 :デフォルトの名無しさん:2020/03/22(日) 00:45:59.87 ID:7aOor4nW.net
>>951
100行以上って理由がわからんよね
どんな言語だって1つの関数が100行超えるようならやめるべきだし
超えるなら別関数(別コマンド)にすればいいのはシェルスクリプトでも同じ

955 :デフォルトの名無しさん:2020/03/22(日) 05:06:02.12 ID:5UlsRo7e.net
>どんな言語だって1つの関数が100行超えるようならやめるべきだし

これもよくわからんけどなあ
最初に一回だーっと降りてくるだけの処理を
こまこまこまこま関数に分けたがる奴はなんなん?と思う
シェルスクリプトなんか大体そういう処理だけだろ?

956 :デフォルトの名無しさん:2020/03/22(日) 05:49:25.01 ID:7aOor4nW.net
>>955
え?シェルスクリプトで外部コマンド使わんの?

最初に一回だーっと降りてくるだけの処理でも
その中の一部を外部コマンドとか関数にするでしょ?
再利用するとか、そこだけ実行できるようにするために。

957 :デフォルトの名無しさん:2020/03/22(日) 05:55:46.13 ID:7aOor4nW.net
あと「関数や処理が長くなったら分けるよね」という
技術的な話に対して「分ける」or「分けない」とは無関係な
「俺はシェルスクリプトで長い処理は作らない」という
個人的な話をごちゃまぜにしないでくれ

「分けるよね?」の答えにはなってないから。

958 :デフォルトの名無しさん:2020/03/22(日) 07:35:58.24 ID:5UlsRo7e.net
>>956
引用部分をちゃんと読んでくれよ
あんたが書いた文だぞ?

>>957
>「分けるよね?」の答えにはなってないから。

長さじゃ分けない。

959 :デフォルトの名無しさん:2020/03/22(日) 07:52:15.98 ID:7aOor4nW.net
>>958
じゃあ何で分けるのさ?

960 :デフォルトの名無しさん:2020/03/22(日) 09:08:29 ID:c5TE3idF.net
>どんな言語だって1つの関数が100行超えるようならやめるべきだし
を何度読んでも、そのとおりとしか?

961 :デフォルトの名無しさん:2020/03/22(日) 10:24:47 ID:I5Su+SV6.net
GoogleのStyle Guideには100行超えるようなスクリプトを書いてるなら
今すぐもっと構造化された言語で書き直すべきって書いてる

>If you are writing a script that is more than 100 lines long,
>or that uses non-straightforward control flow logic,
>you should rewrite it in a more structured language now.

関数の長さじゃなくスクリプトの長さの話
似てるけど持ってる意味合いが違う

962 :デフォルトの名無しさん:2020/03/22(日) 12:56:41.04 ID:tFupwLj7.net
シェルスクリプトも十分構造化されてると思うんだけどねぇ。
まあ,Pythonとかに比べれば,メッソドや継承とかそういう概念が備わってない意味では低級だけど,

「シェルスクリプトで巨大なプログラムを書くべきでない理由」として
「シェルスクリプトは*構造的*でないから」ってのはちょっと頂けない。
シェルスクリプトには構造化プログラミングを支援する機能(函数定義,局所変数)が備わってる以上,
構造化されてないシェルスクリプトがあったならそれは書いた人間の責任であって,
もっと言うとそういうシェルスクリプトを書くような人間は,
Pythonであっても,用意されたオブジェクト指向の機能なんて使わずに,ひたすら手続き的なプログラムを書くだろう。

963 :デフォルトの名無しさん:2020/03/22(日) 13:04:15.24 ID:c5TE3idF.net
>>962
そういうことだよね。
シェルスクリプトで書いたそのコードを
他の言語で書いたところで、ロジックが同じなら行数も同じ

964 :デフォルトの名無しさん:2020/03/22(日) 14:10:38.21 ID:An20OwGu.net
>>952
懇切丁寧な解説が初心者向けじゃないなら何なのさ
常識しか載ってなくてつまらなかった?

965 :デフォルトの名無しさん:2020/03/22(日) 14:27:24.29 ID:Hw+To0D5.net
何を絡んでいるんだか

966 :デフォルトの名無しさん:2020/03/22(日) 14:32:07.41 ID:Hw+To0D5.net
結論、初心者も視野に大いに入っている規約。ある意味初心者に合わせた
だから、100行についてあれこれ議論してもしょうがないよ、Googleにコード提供するわけでもなし変だと思うならふーんと無視だなw

967 :デフォルトの名無しさん:2020/03/22(日) 15:21:02.01 ID:I5Su+SV6.net
>>962
同じロジックでも行数は全然違ってくるよ
shやbashには型がないのと原始的エラーハンドリング機構しかないのが大きい

他にも高階関数がまともに書けないし
一般的な言語に用意されてる便利メソッドもないし
モジュール化機能も関数とファイル以外に無い

読みやすさ、メンテしやすさ、テストのしやすさの点から
シェルスクリプトの限界を認識して節度を持って使おうねってのが
Googleのガイドの意図だと思う

968 :デフォルトの名無しさん:2020/03/22(日) 15:21:37.48 ID:I5Su+SV6.net
>>967
アンカ間違えた

969 :デフォルトの名無しさん:2020/03/22(日) 15:48:56 ID:c5TE3idF.net
>>967
型がないのは他にも有るだろ
エラーハンドリングも例外がない言語はいくらでもある
高階関数はevalで関数をよびだすことができるので同等のことは出来る
メソッドはオブジェクト指向じゃないから関数として
外部コマンド=シェルスクリプトの関数なんだからたくさんある
モジュール化機能って関数とファイル以外に何が必要なんだ?

> シェルスクリプトの限界を認識して
その限界の理由がはっきり書かれてない。

読みやすさが悪い、メンテしやすさが悪い、テストのしやすさが悪い
という"結論"を言ってるが理由がない

970 :デフォルトの名無しさん:2020/03/22(日) 16:56:26.48 ID:I5Su+SV6.net
>>969
>型がないのは他にも有るだろ
例えば?

>エラーハンドリングも例外がない言語はいくらでもある
最近の言語で例外もパターンマッチもないのはGoくらい
Goはそれもあって同じことする場合でも他言語よりも行数が多くなりがち
それでも型と多重代入があるからシェルスクリプトよりはマシ

>高階関数はevalで関数をよびだすことができるので同等のことは出来る
それがまともに書けるという認識なら何を言っても無駄っぽいね
どうぞシェルスクリプトで頑張ってください

971 :デフォルトの名無しさん:2020/03/22(日) 17:17:48.98 ID:I7uR5y3I.net
>>969
機能がある/ない、できる/できないの2択の話でなくて、規模が大きくなったり構造が複雑になったらそれに適した使いやすい言語を使うと良いというだけの話だろうに。

972 :デフォルトの名無しさん:2020/03/22(日) 17:52:07 ID:9SijoV71.net
シェルスクリプトの可読性・保守性について問題ないと思ってる人ってシェルスクリプト以外でコード書いてないのだろうとしか思えない

973 :デフォルトの名無しさん:2020/03/22(日) 18:47:11.03 ID:Hw+To0D5.net
誰もそんなこと言ってないと思うけど

974 :デフォルトの名無しさん:2020/03/22(日) 22:29:55.52 ID:c5TE3idF.net
>>970
> 例えば?
Perl

> 最近の言語で
いきなり言い訳から入るスタンスかw C言語もないですよね

> それがまともに書けるという認識なら
反論できてないじゃんw

>>971
そこに行数は関係ないよね。やってることが同じなら他の言語に変えても同じこと

975 :デフォルトの名無しさん:2020/03/22(日) 22:31:28.16 ID:c5TE3idF.net
>>972
言語で何かが標準サポートされないと
可読性や保守性を保てないんでしょ?

可読性や保守性なんて言語関係ないのに
自分に能力がない理由を言語のせいにするな

976 :デフォルトの名無しさん:2020/03/22(日) 23:46:42 ID:I5Su+SV6.net
>>974
>Perl
Perlには型あるよ
型の有無も分からないレベルなら比較しても意味ないから
もう少しプログラミング言語を勉強してから出直してくれ

977 :デフォルトの名無しさん:2020/03/23(月) 00:00:17.14 ID:FfORFm5F.net
>>976
配列とか数値なら、シェルスクリプトにもありますよw

man basnより

declare [-aAfFgilrtux] [-p] [name[=value] ...]
-a 各 name は配列変数です (前述の 配列 を参照)。
-A 各 name は連想配列変数です (前述の 配列 を参照)。
-i 変数を整数として扱います。

978 :デフォルトの名無しさん:2020/03/23(月) 00:28:12.94 ID:nPflIkhM.net
basn ってw 落ち着けよw

979 :デフォルトの名無しさん:2020/03/23(月) 00:30:27.51 ID:FfORFm5F.net
どうでもいい指摘はいらんがな

980 :デフォルトの名無しさん:2020/03/23(月) 01:15:14 ID:TYte82vJ.net
次スレ

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

981 :デフォルトの名無しさん:2020/03/23(月) 01:16:08 ID:nPflIkhM.net
訂正しとけよw

982 :デフォルトの名無しさん:2020/03/23(月) 10:39:17.98 ID:iyDg9ARV.net
>>977
>配列とか数値なら、シェルスクリプトにもありますよw

型がどういうものか何も知らないんだな
マジでもう少し勉強したほうがいいよ

結局シェルスクリプトしかできなくて他の言語使えと言われると困るから
「シェルスクリプトでもできるもん」て必死に言い訳してるだけ
VBAしかできないVBAerと同じで完全に老害だぞ

983 :デフォルトの名無しさん:2020/03/23(月) 10:58:57.53 ID:pXU5nyzo.net
あくまで「効率的に」できるかどうかの話をしているはずなのになぜか言語仕様上できるかで語るからおかしなことになる

984 :デフォルトの名無しさん:2020/03/23(月) 12:00:16.76 ID:nemSJghh.net
「(俺はシェルスクリプトしか書けないから)シェルスクリプトで書くのがもっとも効率的だ」

985 :デフォルトの名無しさん:2020/03/23(月) 12:53:13.68 ID:SU+/TFOc.net
>>982
ある言語に型がある、って、どういう挙動をしたらそう言えるの?
Bashでは事実「これは整数だよ」と(少なくともプログラマに対して)そう言えるんだけど、それじゃだめなの?
逆にPythonは変数宣言する時に型を明示しなくてもいいけど
一般に「型を持つ」って言われるよね。

986 :デフォルトの名無しさん:2020/03/23(月) 13:15:59.08 ID:cSlylFOX.net
それはちょっと違うな
双方とも、話が噛み合ってなさすぎ

987 :デフォルトの名無しさん:2020/03/23(月) 13:17:16.43 ID:xNveXtQI.net
比較検討の対象範囲が狭い人が堕ちる地獄だね
傍から見ると、視認可能な穴に自ら飛び込んでいるように映る

988 :デフォルトの名無しさん:2020/03/23(月) 13:55:21 ID:1yvBsEB/.net
>>982
声が震えてるぞw

知らないんだな(くっ何も言い返せない)
捨て台詞かよwww
自称知ってるお前さん、ちゃんと説明してみぃ?

989 :デフォルトの名無しさん:2020/03/23(月) 13:56:23 ID:1yvBsEB/.net
>>983
効率的に出来なかったら何がだめなのか?
今の話に「効率」がどう関係するのか?
説明は?

990 :デフォルトの名無しさん:2020/03/23(月) 14:38:42 ID:OwPrjqjt.net
>>932
> 型がどういうものか何も知らないんだな
> マジでもう少し勉強したほうがいいよ

説明なしに相手をディスるだけのレスはやめとけ
マウント取れないし、捨て台詞的で負けを認めたと取られかねない
仮にマウント取れても所詮匿名の掲示板なんで dat 落ちすればそれまで


>>989
> 今の話に「効率」がどう関係するのか?

話の発端は「もっと構造化された言語で書き直すべき」でしょ?
揚げ足取りするなとは言わんが本題を忘れるほど熱中すんな

991 :デフォルトの名無しさん:2020/03/23(月) 14:41:24.44 ID:cOy+SXou.net
>>990
シェルスクリプトが得意な分野
(コマンドの組み合わせで行う処理)は
シェルスクリプトが一番効率がいいんですよ。

他の言語で同じことを書いたら行数が増えます。
例えばsed

992 :デフォルトの名無しさん:2020/03/23(月) 16:50:24.71 ID:OwPrjqjt.net
>>991
仲裁に入っただけの俺にそんな返しされても困る

993 :デフォルトの名無しさん:2020/03/23(月) 17:22:17 ID:gNyotYW5.net
>>982
予め断っておくが,
俺自身は「シェルスクリプトは万能」だなんて思ってない。
でも,プログラミング言語においてどういうものを「型」といって
どういうものを「型」と言わないのかを知りたい。
少なくともBashのdeclare組み込みコマンドには型機能が備わってるように見えるんだけど……
https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html#index-declare
例えば「整数」として取り扱う場合には算術演算が記述できる,空だけど配列変数として指定できる,
みたいな機能って,「型」って言わないの?

994 :デフォルトの名無しさん:2020/03/24(火) 01:28:15.59 ID:dWYBHKWQ.net
>>947
それ、スペースの入り方によってはうまくいかんよね。
やっぱ普通にダブルクォーテーションで括った方が良いのでは?

995 :デフォルトの名無しさん:2020/03/24(火) 22:04:54 ID:/ZNMWK8v.net
シェルスクリプトで完結することはシェルスクリプトでやったほうがいいと思うわ。
プログラミング言語みたいにいちいち環境を構築しなくていいからね。

996 :デフォルトの名無しさん:2020/03/25(水) 08:34:13 ID:OJUUwfHr.net
>>991
sed楽だなー
改行も当然消せるよな、あれ、なんか面倒くせーぞ
そういう時はtr使うのか、なーんだよ
みたいな事がよくある

997 :デフォルトの名無しさん:2020/03/25(水) 09:05:46.32 ID:CcGCNzeN.net
>>995
人によって"シェルスクリプトで完結する"感覚が違うのが問題の始まり

998 :デフォルトの名無しさん:2020/03/25(水) 09:59:10 ID:C+CVbv8A.net
>>997
シェルスクリプトでコードが大きくなったら別言語でやる
というのは、単にシェルスクリプトをちゃんと勉強してないからだと思う

もともとシェルスクリプトでは実装が難しい問題であれば
最初からシェルスクリプトは使わない。例えばバイナリファイルとして
特定の位置のデータを読み書きするとか

でも最初にシェルスクリプトでやろうと思った時は、
シェルスクリプトでやるのが適した問題だったのだろう。
その後、やっぱり他の言語で〜って言い出す時は、
シェルスクリプトで作る能力がないことの言い訳だと思う

999 :デフォルトの名無しさん:2020/03/25(水) 10:11:05.97 ID:Y57VqPvD.net
読めてないのに参加するなよ

1000 :デフォルトの名無しさん:2020/03/25(水) 10:25:14 ID:C+CVbv8A.net
>>999
おまえには理解できんだけさ

1001 :2ch.net投稿限界:Over 1000 Thread
2ch.netからのレス数が1000に到達しました。

総レス数 1001
290 KB
掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★