X



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

レス数が1000を超えています。これ以上書き込みはできません。
2019/10/25(金) 00:08:45.53ID:6btPTvif
シェルスクリプトに関する総合スレッドです。

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

シェルスクリプト総合 その31
https://mevius.5ch.net/test/read.cgi/tech/1565446670/
2019/10/25(金) 00:09:51.40ID:6btPTvif
・特記なき場合、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でそれらしい単語による簡単な検索もできます
・ワイルドカードは正規表現ではありません
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
2019/10/25(金) 00:10:25.47ID:6btPTvif
関連スレ

【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/
2019/10/25(金) 00:31:55.29ID:pN2Np6rx
隣で仕事してる他社のチームが、新人にコマンドプロンプトのことをMS-DOSって教えてて笑える
2019/10/25(金) 02:33:05.14ID:IsBuDbrd
業界内で技術用語を正確に把握している人が果たして何人いるんだろうか?
2019/10/25(金) 15:16:28.60ID:L9QL6FGO
コマンドプロンプトのことをなんと教えるか?

× MS-DOSのようなもの
○ ハドソンのゲーム、バニーガール殺人事件のようなもの
https://middle-edge.jp/articles/bFwpM
2019/10/25(金) 18:14:14.63ID:ggZuLyhL
Win9xまではコマンドプロンプトのアイコンがMSDOSだったんだぜ
8デフォルトの名無しさん
垢版 |
2019/10/25(金) 19:44:43.63ID:f89Z34lq
あれって MS-DOS プロンプトって名前じゃなかった?
Windows NT の方はコマンドプロンプト。
2019/10/25(金) 21:05:38.68ID:AWtm0G4L
先輩がコマプロとか言っててキモかったな(´・ω・`)
2019/10/25(金) 21:16:19.65ID:Qd2+OiXZ
そういう誰も効かない変な略し方ってどうやって生まれるんだろうね?
俺の知り合いは、AMDをアーマーデーとか言ってた。なんで伸ばすん?
11デフォルトの名無しさん
垢版 |
2019/10/25(金) 23:38:51.04ID:9ZGj0mXw
ドイツ語読みだとしてもマーがおかC
2019/10/25(金) 23:59:50.22ID:6xV0MpQs
そういえばもうDOSプロンプトって言い方しなくなったな
2019/10/26(土) 00:00:29.42ID:hrL9FWKp
XP以降しか使ったことがないって人も増えたからね
2019/10/26(土) 16:02:34.81ID:5U6kcXeJ
MS-DOS の話をしても現在の Windows で再現できないという理由で嘘つき呼ばわりされる。
15デフォルトの名無しさん
垢版 |
2019/10/26(土) 16:33:49.92ID:+M+pJ73c
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.72ID:+M+pJ73c
TRUE=0
FALSE=1

と書いたほうが遥かにマシだが、
これでも、[ $TRUE ] も [ $FALSE ] も共に 0(成功)を返すので
なんだかなーって感じw
17デフォルトの名無しさん
垢版 |
2019/10/26(土) 16:38:37.76ID:+M+pJ73c
>>15は [ ! $TRUE ] ← こういうコードを書いてますが、
つまりこういうことですよ

FLAG=$FALSE

if [ $FLAG ]; then
 echo ここが実行されるwww
fi
18デフォルトの名無しさん
垢版 |
2019/10/26(土) 16:49:43.23ID:+M+pJ73c
変数($FLAG)に、0 or 1 を入れてる人は、

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

if [ $FLAG -eq $TRUE ]; then とか
if [ $FLAG -ne $TRUE ]; then って書かないといかん
2019/10/26(土) 17:19:51.21ID:swDBEFOl
if $FLAG ; then

書き方も知らんらしいw
20デフォルトの名無しさん
垢版 |
2019/10/26(土) 20:30:57.76ID:+M+pJ73c
0: コマンドが見つかりません

www
21デフォルトの名無しさん
垢版 |
2019/10/26(土) 21:19:29.63ID:axNoNf0W
https://stackoverflow.com/questions/2953646/how-can-i-declare-and-use-boolean-variables-in-a-shell-script
22デフォルトの名無しさん
垢版 |
2019/10/26(土) 21:55:28.23ID:NL9ts++5
>>21
Mikuの回答とやらで混乱しすぎててわろたw

ま、普通考えて、変数の内容を実行するのは危険だわな
2019/10/26(土) 23:37:13.88ID:9r5pzvRl
いつものとっちゃんが来てたのか
24デフォルトの名無しさん
垢版 |
2019/10/26(土) 23:42:04.85ID:Mu/CRk1W
0: コマンドが見つかりません
を確かめようと、WSLで実行したらエラー無く実行されたw

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

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

ちなみに1はないのでエラーになる
2019/10/27(日) 12:52:55.51ID:HgLbCoih
>>9
DECのVAX上で動くシェルスクリプトのようなものでコマプロってあったな
先輩からはコマンドプロシジャーの略って聞いたけど
今調べると「DCL および MCR コマンド言語インタプリタ」って言うのっぽい
適当にぐぐって出てきたPDFに載ってるそれらしい用語だけどさ
20年以上前の話だ、なつかしい・・・
2019/10/27(日) 23:45:43.77ID:seZQk3at
質問スレでこっちでやれってレスもらったのできました。
そのまま同じ書き込みします。

リモートで最新の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)

うまくいくようにアドバイスなどいただけるとうれしいです。
2019/10/28(月) 00:08:46.94ID:+rzOrIi/
rm以降をクウォートしてないからじゃないの?
2019/10/28(月) 00:11:36.36ID:UoBv9hmi
ssh host 'ls -1t /home/app/'${var}'/*.log | tail -n +2 | xargs rm -f'

とか
2019/10/28(月) 00:25:54.20ID:IRy7CIwD
クォートと中なら、平気、なの
2019/10/28(月) 00:28:19.46ID:XocDEeOH
この程度でいちいちbash依存しないでほしい

set -- 201909 201910

for var in $@
2019/10/28(月) 00:34:13.46ID:UoBv9hmi
for loop の場合、デフォルトでは "$@" が対象になるので

for var;do ... ;done

と書ける
2019/10/28(月) 00:48:08.79ID:h0m+PRW8
>>27
クォートしても同じでした。
ls: /home/app/201909/*.log: No such file or directory

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

>>30
ハゲろ!
2019/10/28(月) 00:49:49.60ID:+rzOrIi/
>>26
ssh host 'rm -f $(tail -n+2 $(ls -1t /home/app/'"${var}"'/*.log))'

ってやればいいと思うけど
>>28の人が書いたようにパイプ使ったほうが読みやすい
2019/10/28(月) 00:50:45.01ID:UoBv9hmi
$HOME/.ssh/config に RequestTTY とか書いてない?
2019/10/28(月) 01:18:31.93ID:h0m+PRW8
考えてくれて、レスをくれてありがとうございます。

>>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を書いてます。

取り急ぎ報告します。エラーについては調べてみます。
2019/10/28(月) 01:42:31.88ID:h0m+PRW8
bash: /bin/rm: 引数リストが長すぎます
についてはしかたないので>>28さんのパイプを使うことにしました。

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

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

とりあえず当初の目的は達成できました。
みんな親切にありがとうございます。
2019/10/28(月) 13:32:08.60ID:S2HNyEoD
curl ja.wttr.in/tokyo
curl cheat.sh/ls
これ以外に端末で使える便利サイトってある?
2019/10/28(月) 13:35:16.78ID:tEsfLTI+
宣伝おつ
39デフォルトの名無しさん
垢版 |
2019/10/29(火) 09:50:33.80ID:zCzSjgo7
sshを複数回動かすよりも一回で全部やらせちゃった方が効率良いような気がするんだ
2019/10/29(火) 11:14:16.19ID:2AEjd6SF
なにそれ、よさそう。
でもわたしの頭ではどうしたらよいものやら。。
41デフォルトの名無しさん
垢版 |
2019/10/29(火) 12:20:30.44ID:zCzSjgo7
forのループごとsshで引き渡せばいいじゃん。1行の長いシェルスクリプトってことね。
2019/10/29(火) 13:55:53.48ID:2AEjd6SF
まだ帰宅していないので考えただけですが、
ls | tail | rm したいディレクトリが11個あって、
ディレクトリのpwdは/home/'"$var"'/'"$i"'/ みたいに2箇所変数にしてます。
それをssh1行でループを送れるバエた方法があるますか?
2019/10/29(火) 13:59:15.42ID:2AEjd6SF
たしかにsshのループの時にいちいち
Connection to xxx.xxx.xxx.xxx closed
が出てうざかったんですよね。
2019/10/29(火) 14:00:01.92ID:gns1i7FP
ヒアドキュメントにすればいいんじゃない

#!/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
2019/10/29(火) 14:19:01.08ID:gns1i7FP
と思ったけど、リモートホストのどこかにスクリプトファイルを置いて

ssh host /path/to/script

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

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

なんでこのメッセージが表示されるんだろう…やっぱり pseudo tty を
使ってるよね
2019/10/29(火) 14:32:50.27ID:CowX2GWO
CI/CD で使う、Task Runner みたいな方が良いかも

Ruby なら、Rake を使った、Capistrano とか、
Thor とか
2019/10/29(火) 14:37:21.30ID:g8zM1lJr
rubyはけっこうです
2019/10/29(火) 15:00:21.96ID:2AEjd6SF
> ヒアドキュメント
> リモートホストのどこかにスクリプト
なるほど!それならわたしでも理解できます!

> 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.38ID:zCzSjgo7
sshで接続する先のサーバに予めシェルスクリプト送り込んでおいてsshで実行だけするという手もあるな。
あまりにも長くて複雑な場合はその方が楽だと思う。

ただし、送り込んでから実行するまでの間に何者かによって別のファイルに置き換えられてしまったら終わりなのでその心配のない環境でしかできない。
50デフォルトの名無しさん
垢版 |
2019/10/29(火) 15:59:43.78ID:zCzSjgo7
うう。リロードし忘れて書いたら既に同じようなのが書かれている。orz
2019/10/29(火) 16:01:56.26ID:spBBwL/I
やり方は忘れたが、ローカルでgzにしたものをワンライナーで
送ってリモートに保存せずに実行っていうのをやったことがある気がする
かもしれないけど、保存していたかもしれない
5246
垢版 |
2019/10/30(水) 15:36:46.01ID:p2ffZ2o0
環境構築のChef は、サーバーに、Ruby をインストールする。
そこで、サーバーに、Ruby Script を転送して、Rubyで実行する

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

他にも、Capistrano, Terraform などもある
2019/10/30(水) 18:02:20.30ID:ssr4q2PY
>>52
きたーーー!!!
2019/10/31(木) 17:56:20.75ID:pBbgzdOe
cshで書いたスクリプトの途中でキーから入力をしたいんですが
なんという命令で実現できますか?
2019/10/31(木) 18:01:50.06ID:wR8wpXdO
set key_input = $<
2019/10/31(木) 19:36:28.51ID:pBbgzdOe
>>55
サンクス(´・ω・`)
2019/11/06(水) 17:06:15.24ID:4kXKpMLv
aliasってxargsじゃ使えないけど使えたらまずいんだろうか
関数ならexportすればできるけどさ
58デフォルトの名無しさん
垢版 |
2019/11/06(水) 19:12:11.78ID:wTTuQQRz
>>57
まずいとかいうわけじゃなくて、xargsは外部コマンドだよ。
例えば、俺がC言語であるプログラムを作ったとする。
俺のプログラムから、親プロセス(シェル)がなにかもわからないのに、
そのシェルで定義したメモリ内部のものを呼び出せるわけがない
59デフォルトの名無しさん
垢版 |
2019/11/06(水) 19:12:36.64ID:wTTuQQRz
関数も無理やろ?
2019/11/06(水) 19:20:58.71ID:wTTuQQRz
たたbashに関数をexportできる機能があるってのは不思議なんだよなw

まあなんか変なことしてるんだろう。で気にしてなかったけどさ、
少し試してみたら、bashからbashを起動したときには使えるが、
zshだと使えないし、bash→dash→bashの流れでも使えない。
どういう仕組なんだろう?
2019/11/06(水) 19:34:34.77ID:OvjaMqE0
echo 'Hello World' | xargs -I@ bash -c $'shopt -s expand_aliases;alias p="echo";\n p @'
2019/11/07(木) 00:18:43.96ID:dfqCliYv
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で見た
2019/11/07(木) 08:59:49.28ID:C0Y8MuYI
macては動かないのでwindows使ってくださいみたいな暴論
2019/11/07(木) 11:05:05.20ID:cfhO2vSD
>>60
export -f は環境変数に
BASH_FUNC_関数名%%=関数を文字列
を設定してるだけだからじゃね。bashは起動時に環境変数にそゆのがあったら関数とし展開するから使える、その他はそんな環境変数知らんから単なる環境変数のままな感じな
dashは起動すると、その環境変数が引き継がれないからそこで断ち切られる感じかな
関数にしろaliasにしろサブプロセスに引き継ぐという考え自体がイレギュラーな感じだな
2019/11/07(木) 11:11:30.53ID:sEmiRyTj
>>64
やっぱり環境変数経由なのか?
でもちゃんと確認したんだけどなw

まさかbash以外の外部コマンドを実行するときに削除してるとか?
そしてbashの中からexport -pとかしたときは省いてるとか?
2019/11/07(木) 11:19:16.71ID:cfhO2vSD
>>65
bash -> zsh -> bash
で、bashでは関数になってるけど。zshでも環境変数には存在する
環境変数の引き継ぎってどうなってたかなあ
2019/11/07(木) 11:26:10.68ID:mwfKyddL
なんかもろにそれっぽいのがあった。dashは一般的でないような名前のは削除するらしい
https://unix.stackexchange.com/questions/498905/why-is-my-bash-func-foobar-environment-variable-unset-in-shell-subprocesses
2019/11/07(木) 11:52:29.35ID:sEmiRyTj
ようやく見れたw
envで見れるね。export使ってた。
2019/11/07(木) 11:53:35.24ID:sEmiRyTj
この変数使えば、なにか面白いことできそう。
ってか、xargsの引数にできないか?
2019/11/07(木) 11:54:11.02ID:sEmiRyTj
bashを介せば
2019/11/08(金) 00:07:00.88ID:jWGBsuvq
alias xargs='xargs '
echo *txt | xargs ll
.basurcの登録分はこれでもいける
2019/11/14(木) 12:41:11.56ID:RaS+/sOM
uucpとかって今時どういう活用法あるかな?
2019/11/14(木) 12:59:55.09ID:GaAZ8ORG
TrailBlazer でも手に入れたのか
74デフォルトの名無しさん
垢版 |
2019/11/27(水) 15:42:28.61ID:JZevxkSS
kill とtrapでソフトタイマ作ってみた。需要あるかな
2019/11/27(水) 16:34:50.24ID:KOWJoLHR
sleepと何が違うん?
76デフォルトの名無しさん
垢版 |
2019/11/27(水) 18:43:12.26ID:9SXmP3sk
SECONDSとの比較だからずれの蓄積がない。
平行処理が出来る。
2019/11/27(水) 18:48:52.87ID:KOWJoLHR
ずれの蓄積に関しては、sleepでも補正していけばなんとかなるので。
並行処理はまあそうだね。需要あるんじゃない?
コード見てなにかに使えそうなら使うかも
どこまで作り込んでるのかしらないが
78デフォルトの名無しさん
垢版 |
2019/11/28(木) 06:15:51.80ID:f/6vs/+B
シグナル発生をバックグランドで動かしシェルスクリプトのプロセスに送るのがかなめ。
2019/11/28(木) 07:03:59.17ID:uZo2jF8i
うん。それはわかるw
前に条件を満たすまで無限ループ+タイムアウト機能ってのを実装したことがあるから
結局複雑な割にタイムアウトすることはまず無いので廃止したけどさ
2019/11/28(木) 07:05:43.89ID:uZo2jF8i
もしここに書いたらレビューするかもね
内容が気に入ればだけど
81デフォルトの名無しさん
垢版 |
2019/11/28(木) 08:08:54.32ID:f/6vs/+B
いっぺんにアップできないから小出し。
#! /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.03ID:f/6vs/+B
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.57ID:f/6vs/+B
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.34ID:f/6vs/+B
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;
終わり
2019/11/28(木) 08:24:45.92ID:uZo2jF8i
なんか動いてるけど、何やってるのかわからんなw
とりあえずCTRL+Cで停止しなかった。
86デフォルトの名無しさん
垢版 |
2019/11/28(木) 08:29:37.54ID:f/6vs/+B
動作を確認するためタイマーのカウントとセットを繰り返しています。
終了するためにはSIGKILLを与えてください。
2019/11/28(木) 08:30:36.19ID:uZo2jF8i
しばし読んでみたけど、やっぱりわからんw

これ指定したn秒ごとにシグナル送るんじゃないのか?
tim配列とかtim_flgの意味がさっぱりだ
2019/11/28(木) 08:41:39.82ID:uZo2jF8i
簡単な所から。まずシグナルはSIGはいらんぞ。
bash限定ならそれでもいいがPOSIX的には無いほうが正しい。
INTはCTRL-Cなので、USR1またはUSR2、もしくはSIGHUPとかの方が良い。
セミコロンはC言語じゃないんだから行を継続しないときにはつけないのが一般的
89デフォルトの名無しさん
垢版 |
2019/11/28(木) 08:42:09.42ID:f/6vs/+B
各タイマが0になったらなんかをちょっとやり、またタイマをセットするというプログラムです

tim配列はタイマ本体です。tim_flg配列はタイマ使用/不使用のフラグです。
2019/11/28(木) 08:49:25.10ID:uZo2jF8i
やっと理解したが、これ説明なしに理解するの大変だぞw
本質的じゃないコードが複雑でそっちのほうが多すぎる。
2019/11/28(木) 08:51:32.36ID:uZo2jF8i
tim_flgの意味がないな。いや意図は想像できる。(というか>>89に書いてあるか)
サンプルとしてはノイズにしかなってないので理解ができない。
2019/11/28(木) 21:14:01.96ID:uBUVzLWV
宿題の添削をしてやるとか親切たなw
2019/11/28(木) 21:36:47.47ID:asJppHFe
目的は、bash依存すんな。って言うことだったんだがなw
流石にbash依存してる部分が、本質的じゃない所ばかりだとやる気が。
バッサリ削ったら簡単に、bash依存なくせるんでどうしようかなと思いながらレス待ちw
2019/11/28(木) 23:49:59.71ID:RaRUIeaw
bash依存しまくりで
https://wandbox.org/permlink/EHSiHk726Bn4qvVO
95デフォルトの名無しさん
垢版 |
2019/11/29(金) 00:53:33.34ID:Fh79+8D6
あんまりソフトタイマに有用性を感じてもらえないようで残念でした。
2019/11/29(金) 01:09:45.97ID:IIqk2+5U
timeoutでやっつけ
2019/11/29(金) 02:19:44.34ID:XcyRQJ1W
>>95
タイマに有用性がないんじゃなくて
君が作ったスクリプトに有用性がなかったんだよ
2019/11/29(金) 04:30:20.91ID:9RHOSbKH
>>94
めんどくせーから、もうそれでいいやw

その程度でbash依存するな
https://wandbox.org/permlink/Uh4eQX682YzoK8rn
2019/11/29(金) 05:10:07.47ID:hA38q2SN
おれおれかよ
100デフォルトの名無しさん
垢版 |
2019/11/30(土) 00:04:41.28ID:FMRNVBPU
Wgetであるサイトの特定のディレクトリ配下の特定のファイルを
ダウンロードしたくて下記のコマンドを書いてもルートのindex.html
しかダウンロードしてくれません。

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

wget -r -A Download拡張子 -I /Downloadディレクトリ URL
2019/11/30(土) 00:53:41.92ID:KUL76oc2
オプションに -e robots=off -U mozilla でも付けてみたら上手く行くかも
2019/11/30(土) 00:54:25.61ID:czFcPKLy
碌に調べずの返答でアレなんだが多分訪問先のサイトがファイル一覧
を返すのを禁止してる(apache httpd だと Indexes オプションが有効
になってない)からだと思う
103デフォルトの名無しさん
垢版 |
2019/11/30(土) 13:20:31.41ID:f33nsdyy
リファラの偽装が必要かも。知らんけど
2019/11/30(土) 16:49:40.30ID:mvBIEviw
googleはbashがデフォルト
2019/12/01(日) 11:47:31.42ID:0pH8jk7+
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.28ID:IoGKXgrY
>>91
tim_flgをゴミ扱いしたこいつがソフトタイマを理解していない。
2019/12/01(日) 19:49:41.33ID:YWi4MX0G
このサンプルでは1固定なんだからゴミやろ
2019/12/02(月) 22:02:29.21ID:9nn8K+iP
親ディレクトリ
-子ディレ クトリ(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がなんやらと警告が出てきます
2019/12/02(月) 22:13:56.47ID:cDa5fVnx
そういう用途なら、forとかlsとか使わないでfind使え
2019/12/02(月) 22:15:41.19ID:cDa5fVnx
いきなりstatがでるような事はやめて、
echo mv なんとか かんとか で実行命令を表示するようにしろ
怖すぎるわ。それやればなんとかなるだろ
2019/12/02(月) 22:19:56.11ID:agtAae1a
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
2019/12/02(月) 22:46:09.47ID:RT0MauQR
find . -name '*[ ()]*' -print | sort -r | while read item; do
mv "$item" "${item%/*}/$(echo "${item##*/}" | tr ' ()' '_')"
done
113デフォルトの名無しさん
垢版 |
2019/12/03(火) 07:24:55.79ID:v9g/lO5M
Ruby で作った。
コードは次のレスに書く

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

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

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

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

処理の途中でエラーになると、エラーまでの処理が確定してしまうから、中途半端で巻き戻せないから、
必ず、親ディレクトリ以下のバックアップを取っておく!
114113
垢版 |
2019/12/03(火) 07:25:55.85ID:v9g/lO5M
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 )
2019/12/03(火) 08:29:02.93ID:ujGDA/f+
なんかかえってめんどくさいことしてんな。perlでめんどくさく書きたいだけ?
2019/12/03(火) 08:29:47.31ID:ujGDA/f+
perlではなくrubyか。しつれい
117113
垢版 |
2019/12/03(火) 09:46:02.07ID:v9g/lO5M
mv を作った奴は、頭おかしいw

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

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

それが分かれていないから、自分で処理を分けて、
かなりチェックしないと、バグってしまう
2019/12/03(火) 12:17:58.24ID:5ZiHQIvd
つまり自分に都合が悪い仕様=バグ
2019/12/03(火) 12:28:33.61ID:Uh1tIUQA
一括リネームってたいてい複雑になるから
GUIツールを使ったほうが良いと思うんだよね

Windows 10版のPowerToysにリネーム機能が追加
https://pc.watch.impress.co.jp/docs/news/1215602.html
2019/12/03(火) 18:09:42.76ID:+zVWCKlo
>>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)
2019/12/03(火) 18:14:03.14ID:+zVWCKlo
>>120
誤 ext="${newname#*.}"
正 ext="${newname##*.}"
2019/12/03(火) 18:30:56.19ID:HnkJN8FN
>>111
rename自体がperlだしちゃんと試行もあるけど
2019/12/03(火) 19:27:45.48ID:mUaHu9IR
>>122
perl ワンライナーより
dry run のスイッチと
どのように変更させるかに集中し
出力確認などの余計なことは共通する定型処理だから
コードにまとめたほうが使いやすい
2019/12/03(火) 19:44:49.63ID:R2wB6lmg
Linuxディストリによっては標準で入っている、perlスクリプトで作られたrenameコマンドのことだろ
2019/12/03(火) 20:48:36.39ID:jDo5c24e
renameは標準で入ってないとはいえ
テスト無しの自作コードでやるような処理じゃないやろ
find -depth -exec rename -nでdry-runしてから-n消せばいい
2019/12/03(火) 21:32:10.96ID:yTVXI633
話のネタから外れて何を主張したいのだか
2019/12/03(火) 22:25:15.93ID:yTVXI633
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
どのバージョンを使ってるのかわからんけど、パッケージによってはものすごいオプション拡張されたのが使われてるねえ
128113
垢版 |
2019/12/03(火) 23:09:51.48ID:v9g/lO5M
Windows10, WSL, Ubuntu 16.04 にも、/usr/bin/rename がある

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

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

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

すべてを更新するか、すべてをロールバックするのどちらかの状態だけにする
2019/12/03(火) 23:14:22.94ID:50yNXJCt
自作コードがそれ以下なのになにを言っているのだか
2019/12/04(水) 00:03:09.04ID:LOcDYH/A
>>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 の方は無傷だからね。好きなだけやり直せるよ。
2019/12/04(水) 02:51:13.25ID:hySlbdZs
pax -rwlpe src dst
2019/12/04(水) 23:27:09.69ID:xn8KyTI4
renameコマンドって複数ないか?
's/パターン/置換文字/' FILEとパターン 置換文字 FILEとサイトによって説明違うんだよな
俺が散らばったファイルをリネームする時はmoreutilsのvidir使ってるけど
テキストエディタで修正する奴な
2019/12/05(木) 00:34:07.65ID:0uggokQM
Larry Wall and Robin Barker版とそれの機能拡張版のAristotle Pagaltzis版じゃね
Aristotle Pagaltzisで増えた -s パターン 置換文字 FILE 使ってじゃないの
2019/12/05(木) 11:01:01.81ID:3XJjcX6a
>>132
util-linux版とperl同梱版(これはさらにいくつかに分かれる)の違い
debian/ubuntu なら前者rename.ul後者rename(Larry Wall版)
centos なら前者rename後者prename(Peder Stray版)
2019/12/05(木) 11:02:39.94ID:6ZFP3Xq2
>>132
Debian系はPerl付属のprename、
CentOS系はutil-linuxのrename.ulをrenameとして使ってるらしい
そら人によって言ってることが違う筈だ
2019/12/05(木) 15:05:31.16ID:0uggokQM
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 だな
2019/12/05(木) 15:14:33.96ID:TzSLtKO4
たぶん基本的なことだと思うんですが、教えてください。

#!/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が入ってしまいます。なぜでしょう…?
2019/12/05(木) 15:19:51.21ID:0uggokQM
Perl同梱(?)のprename/file-renameがLarry Wall版か
Ubuntuで pkg rename (pkg file-rename??)を入れるとprename/file-renameもLarry Wall and Robin Barker版に上書きされる感じかな??
2019/12/05(木) 15:21:52.11ID:0uggokQM
>>138
いや、違った
Perl同梱(?)のprename/file-renameもLarry Wall and Robin Barker版か
2019/12/05(木) 15:22:44.42ID:WdOnkWYr
>>137

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

$ /bin/sh x.sh

とかして実行したんじゃない?
2019/12/05(木) 15:55:06.05ID:Gb1I+/8K
>>137
-eをオプションとして扱うかどうかはシェルによって違う。
bashはオプションだが、dashはオプションではなくただの文字列
2019/12/05(木) 15:58:33.95ID:TzSLtKO4
>>140-141
あ、ほんとだ。
sh -xで実行してました。
bash -xだと大丈夫でした。
シェバン付けてるから大丈夫だと思い込んでました。ダメなんですね。
横着せずにきちんと打つようにします。

ありがとうございました!
143デフォルトの名無しさん
垢版 |
2019/12/06(金) 20:34:56.63ID:08yg4gJX
宇宙刑事シェバン
2019/12/10(火) 22:30:09.16ID:zD6aLrgM
x-y
↑こういう形式の,ハイフンで結ばれた二つの数字の計算結果の正負だけを知りたいのですが,
なるべく処理が早い方法ないですか。
対象の文字列は標準出力ではなくて変数に格納されています。

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

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

やるなら [ $(($var)) -lt 0 ] こうだろうけど
それでも遅いって言うならどうしようもないと思うが、
気になるほど遅いなら別のところに問題があるんじゃね?
2019/12/10(火) 23:24:09.60ID:kdXCWOtW
ちなみにうちのマシンだとこんな感じ

$ 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秒。これが気になるとしたら
相当多くの数の計算をしてることになるはずなんだが本当に?
2019/12/10(火) 23:25:16.53ID:SL+fGedD
echo "$var<0"|bc
2019/12/10(火) 23:28:35.11ID:kdXCWOtW
bcプロセス起動してるから遅い
それは実行しなくてもわかる
2019/12/10(火) 23:50:31.02ID:kdXCWOtW
あとオマケ、速いとは思えないけど

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

これを使ってもできる。
速さは [ ${var%-*} -lt ${var#*-} ] とどっこいどっこいだろうな
もしかしたらset使ったほうが速いかもしれない程度
2019/12/10(火) 23:51:59.49ID:LOypIkS3
>>146
それ100万やったら50秒かかったわ
10万で5秒だしawk使うわ
2019/12/10(火) 23:59:28.15ID:kdXCWOtW
>>150
えらい遅いなw
俺のなんて2012年発売のCPUだぞ。
i7 3770。3.40Ghz(ブースト時で3.9Ghz)
2019/12/11(水) 00:00:32.26ID:ivhCTlPt
i7 3.4Ghzって今どき低スペックなのか?
ハイスペックかと思ってた
2019/12/11(水) 00:00:55.23ID:5YQOA1oq
>>150
awkつかうなら、awkのコード書いてみてくれ
実行してみる。
2019/12/11(水) 00:03:27.10ID:5YQOA1oq
>>152
スペックは低くはないと思うけどさ、もう古いし
中古だと2〜3万円台で搭載パソコンを買えちゃうよ
https://used.dospara.co.jp/sale/search.php?view=1&;kw=Core%20i7%203770&page=1
2019/12/11(水) 00:11:26.60ID:ivhCTlPt
>>154
凄い時代になったなw
いつのまにか皆さんハッピーになってた
2019/12/11(水) 00:15:38.57ID:rj8eSq0k
バックグラウンドで色々動きっぱなし(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遅すぎ・・・
2019/12/11(水) 00:21:29.42ID:5YQOA1oq
>>156
うちもcygwinだとそんな感じだわw msysも
WSLは全然速度変わらないのにな

本質的にCPUだけで処理できる内容のはずだが
なにかシステムコール呼び出してるんだろうな
2019/12/11(水) 00:26:41.57ID:H3x5MOt+
>>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秒くらいになる
2019/12/11(水) 00:40:07.88ID:5YQOA1oq
>>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

まあ速いんだろうけどさ。想定の範囲内かな。
2019/12/11(水) 00:40:26.36ID:H3x5MOt+
ランダムな引き算生成するawkバージョン

$ awk 'BEGIN{srand(); for (i=0; i<1000000; ++i) {print int(rand()*1000)"-"int(rand()*1000)}}' > input.txt
2019/12/11(水) 00:46:42.05ID:5YQOA1oq
お、こっちの方がわずかに速かった。スクリプトで計算させるよりも読み込み時に分割させたほうが良いんだろうな。
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
2019/12/11(水) 00:53:02.45ID:mRJcWm57
$ 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
2019/12/11(水) 00:54:49.86ID:5YQOA1oq
> 対象の文字列は標準出力ではなくて変数に格納されています。

お前らこの条件忘れてるだろw
2019/12/11(水) 01:39:58.92ID:5YQOA1oq
うーん、よく考えるとこれ実際の要件を想定して
「それぞれのコマンドを使って処理をした結果を元に続きの処理をする」となると
差があまりなくなってしまうかもしれん

$ 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
2019/12/11(水) 01:44:25.40ID:5YQOA1oq
$ 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
2019/12/11(水) 01:47:25.15ID:5YQOA1oq
結果をファイルに吐き出すだけなら良いんだけどね、
その結果をシェルスクリプトを使って処理する場合の話
2019/12/11(水) 03:39:07.57ID:MgOCMEvC
>>151
今年出た i5 9500
プロセッサー・ベース動作周波数 3.00 GHz
ターボ・ブースト利用時の最大周波数 4.40 GHz
あんまり変わらない気がする

シェルスクリプトなんかスレッド使わないだろうし
2019/12/11(水) 07:28:04.35ID:hRzITiR9
>>167
スレッドバリバリ使ってるぞw
| つかうと必然的にスレッドになるしな
2019/12/11(水) 08:22:26.35ID:6UY8oXji
>>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の範疇だと思います。
2019/12/11(水) 12:44:26.62ID:MgOCMEvC
>>168
そりゃプロセスだろ
2019/12/11(水) 13:32:50.85ID:hRzITiR9
>>170
今はCPUの話だからハイパースレッディングのスレッドだろう
2019/12/11(水) 13:55:32.35ID:hRzITiR9
>>169
POSIX準拠じゃないのでは?と言ってるのは
$((var < 0)) のvarは数値限定ってところだよ
2019/12/11(水) 15:18:53.13ID:++mq81bA
>>171
> | つかうと
じゃないの。普通は子プロセスだろう
2019/12/11(水) 15:22:46.18ID:++mq81bA
プロセスが別のコアで動くとかか??
スレッドをハイパースレッディングのスレッドを指すなんて初めてみた
2019/12/11(水) 15:28:13.91ID:hRzITiR9
>>173
文句は>>167に言ってくれ。合わせただけ
2019/12/11(水) 15:29:58.09ID:hRzITiR9
>>174
普通にCPUの所に4コア8スレッドって書いてあるからさ
https://kakaku.com/pc/cpu/itemlist.aspx?pdf_se=22&;pdf_Spec306=4
2019/12/11(水) 15:39:31.82ID:++mq81bA
そこまで出されるとマジでスレッドという意味で使ってたんだな
OSも知らないスレッドだろう、OSから見てもただのコアだろう
2019/12/11(水) 15:46:36.17ID:hRzITiR9
>>167涙目www

でよろしいか?
俺に言うなって
2019/12/11(水) 15:55:15.40ID:++mq81bA
一行目なんて書かなきゃならないのね
>>167もそんなスレッドのことを言ってないだろうに。なんでかなw

プロセスじゃなくスレッドならプロセス起動する無駄時間がないとかそういう意味でのだろうし、そもそもスレッドはそういうために
元々のネタがプロセス起動にどれだけ食われてるのかという話だな、するなら
2019/12/11(水) 16:11:12.77ID:6UY8oXji
>>172
なるほど。確かに準拠してませんでした,すいません。
2019/12/11(水) 20:23:56.94ID:MgOCMEvC
>>175
いや、あってないから
勘弁してくれ
2019/12/12(木) 01:47:04.79ID:4Chv4WTd
>>181
シェルスクリプトでスレッドってどういう事?
スレッド使わなくてもコアは使うじゃん。
2019/12/12(木) 02:33:13.07ID:NtLqNRlV
>>182
なんでオレに聞くんだよ
シェルスクリプトはスレッド使わないって当然のこと言っただけじゃないか
なんで頭悪い奴が絡んでくるんだよ気持ち悪いな
2019/12/12(木) 02:40:24.09ID:n05Ewb3K
CPUのスペック比較とシェルスクリプトでスレッド使わないという話とどう関係あるの?
新しいCPUはOSスレッドを効率的に実行できる機能でもあるの?
2019/12/12(木) 03:38:37.48ID:g+q4RhTJ
そうだよな。CPUの話をしていたのに
なんでスレッド使うかどうかの話をしたのかだよな

> 今年出た i5 9500
> プロセッサー・ベース動作周波数 3.00 GHz
> ターボ・ブースト利用時の最大周波数 4.40 GHz
> あんまり変わらない気がする
>
> シェルスクリプトなんかスレッド使わないだろうし
2019/12/12(木) 03:41:30.87ID:g+q4RhTJ
スレッド使わなくてもコア使うから関係あるだろって言えばよかったのか?
i5 9500の名前を出したのは、コア6スレッド6だからだろ?
2019/12/12(木) 08:10:01.85ID:NtLqNRlV
>>184
最新のCPUにしたところで周波数がちょっと早くなった程度で差が無いって話

新しいCPUは同時実行スレッド数が増えてるとか言う奴がいるけどシェルスクリプトには関係ないだろ?
「どう関係あるの? 」とか言われても「関係ない」って最初から書いてんのに読めない訳?
2019/12/12(木) 08:11:55.05ID:NtLqNRlV
>>186
頭悪いなー
シェルスクリプトで使うのは1コアだけだろうが
2019/12/12(木) 09:49:29.49ID:AVYkL4QT
本気でシェルスクリプトとコアが関係ないと思ってるのか?
パイプ使ったら複数コア使うことになるんだが

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

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

自分が並列で動くものを書いてないからって、
シェルスクリプトと並列が関係ないわけじゃないだろ
自分が書かないって話をするならC言語だってコアは関係ない
2019/12/12(木) 09:52:07.59ID:AVYkL4QT
あと、xargsとかGNU parallelとか
2019/12/12(木) 10:19:43.03ID:mtFqZIGW
それはプロセスレベルの並列化のお話。スレッドの話はどこいった?
2019/12/12(木) 10:24:13.74ID:AVYkL4QT
シェルスクリプトで外部コマンドを使わない場合の話でもしてるのか?

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


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

外部コマンド一切なし
2019/12/12(木) 10:24:48.46ID:AVYkL4QT
>>191
今はCPUコアの話
2019/12/12(木) 12:23:33.66ID:NxSFhA/k
>コア6スレッド6だからだろ
それを言うならスレッド12だろ。ハイパースレッディングでスペック表すときの論理コア数をスレッドと言っているにすぎないだろうに
いつものやつが絡んでるだけだろうな、すぐに話を逸らすことからも
2019/12/12(木) 12:43:03.31ID:NxSFhA/k
>>183
まあ、シェル自体はスレッドを使ってることもあるだろう、いまどき
シェルスクリプトを書いてどこがスレッドとか全然わからん、どうスクリプト書けばスレッドになるのかなんて全然わからないとこではあるので、そういう意味ではスレッド使わないと言えるだろうけど

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

使ってる環境のshの実態がなんによるかが大きいんじゃないのかな?bashはかなり遅い感じかなあ
2019/12/12(木) 12:57:42.86ID:NxSFhA/k
>>195,183
>まあ、シェル自体はスレッドを使ってることもあるだろう、いまどき
いや、いまどきも1シェルプロセスは1スレッドしかなのか。仮にスレッド使う場合があったとしてもどういう場合というのはわからんな
確認せずにいまどきならと書いた、すまん
2019/12/12(木) 16:08:19.94ID:AVYkL4QT
>>194
i5 9500は6コア6スレッド
なんでこういつも思い込みで発言するかな?

URL貼れないから「インテルR Core? i5-9500 プロセッサー」からググれ
2019/12/12(木) 16:10:23.64ID:AVYkL4QT
>>195
OSのスレッドは使ってなくても、
CPUのコア数が多ければ、シェルスクリプトでそれを使えるから
コア数の数はシェルスクリプトでも意味があるよって話
2019/12/12(木) 16:11:47.38ID:AVYkL4QT
>>105
> なんでこういつも思い込みで発言するかな?
そりゃそうやろw

ただの1-2の計算なんか、どんな言語使っても
スレッドの効果なんてねーよw
言語じゃなくてやる処理の問題
2019/12/12(木) 16:24:20.77ID:AVYkL4QT
ちなみに>>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'
2019/12/12(木) 16:41:19.05ID:1H8k0UmA
自己文書化(?)されたシェルスクリプトの例
http://www.tip.net.au/wiki/index.php/Self_documenting_bash_script_options
もうちょっと洗練して、例えばhelp関数から実行するときはgettoptsコマンドを
ヘルプ出力用に書換えたものにするなんてこともできそう。
2019/12/12(木) 16:43:22.79ID:AVYkL4QT
>>201
それ何が嬉しいん?
ロングオプションがあればいいだけの話?
2019/12/12(木) 16:49:53.62ID:mtFqZIGW
$ seq 1 inf | tail

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

$ top -1

を実行してみる。f キーを押して fields management 画面に進んで
"Last Used Cpu" を選んで表示させる様にするとプロセスがどの
CPUコアで実行されているか表示される
2019/12/12(木) 17:08:05.32ID:1H8k0UmA
>>202
わざわざヘルプを別個に書かないでも
gettopts ... case ...
↑この行を解析できるようになれば
半自動的にヘルプが生成できる(のでは)ってことじゃない?
2019/12/12(木) 17:46:32.53ID:3GyD1b3F
>>197
ああ、ハイパースレッディングなんてないCPUか。そりゃすまん

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

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

>>199言い足りなかったのねwやはりいつものか
2019/12/12(木) 17:46:52.23ID:AVYkL4QT
>>204
ああ、ヘルプの自動生成か。悩むところだよね。
簡単なのなら確かにそのリンク先みたいにできるだろうけど
時々例外的なコードはいるしさ、

とういうかリンク先、なんであんなよくわからんコードなんだ?
もっと簡潔にかけそうなんだが
txmp.txt? zenity?ん??GUI表示するため?
2019/12/12(木) 17:48:26.91ID:AVYkL4QT
>>205
コア6(ハイパースレッドなし) と書くよりも
コア6 スレッド6 の方が明確で短いだろw
2019/12/12(木) 17:53:26.87ID:AVYkL4QT
試しに書いてみようかと思ってコピペしようとしたら画像やしw
2019/12/12(木) 18:02:50.61ID:CkUjiG2X
>>207
今回のハイパースレッディングでのスレッドを言い出し絡みまくりからは、ないな
2019/12/12(木) 18:16:03.44ID:n05Ewb3K
>>188
>頭悪いなー
>シェルスクリプトで使うのは1コアだけだろうが
えっ?

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

話が噛み合ってなかった理由がわかってみんなスッキリだね
2019/12/12(木) 18:21:26.57ID:CkUjiG2X
>>210
ん?オプティマイズが仮にあったとしても並列はしないだろう、あの文では
並列にになるように書いた「別の」スクリプトとは別の話だけど?

「え?」じゃなくどうスレッドの効果があるように思うの?みんなはスッキリするかもwだが俺はもやもやもやもやするぞw
2019/12/12(木) 18:22:28.30ID:AVYkL4QT
>>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
2019/12/12(木) 18:26:08.31ID:AVYkL4QT
>>211
今シェルスクリプトの話をしてるんですよ?

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

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

最初からシェルスクリプトで並列処理できないと思ってたのバレバレだから
2019/12/12(木) 18:33:38.18ID:CkUjiG2X
ああ、>>184なのかそもそもは
スレッド使ってなんか賢いことしてたら、プロセス起動する時間や並列なんぞで速くなるとか思ったのだろう、よくわからんけどw
(スレッド使えば速くなると思いがちというのはありがち)

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


>>213
イミフ。何をいいたいのかな?C??妄想すぎるな
2019/12/12(木) 18:38:11.60ID:CkUjiG2X
>>213
ああ、誰かと同一人物だと思ってる??違うよ
>>167だって、>>170と言っているだろう(プロセスで並列処理だろう)、
>最初からシェルスクリプトで並列処理できないと思ってたのバレバレだから
とんちんかんな決めつけだろうなw
2019/12/12(木) 18:57:21.35ID:CkUjiG2X
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がプロセスだがスレッドを使っていたりしても、しないだろう

「え?」って何か他にスレッドの効果を出すやり方あるかなあ??スレッドを使ったとして
2019/12/12(木) 19:01:40.02ID:AVYkL4QT
>>215

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

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

並列処理しないコードはコアを使わないと言われても
どんな言語でも当たり前としか言えない。そういう話
2019/12/12(木) 19:04:56.67ID:AVYkL4QT
>>214

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

正しい答えはシェルスクリプトでも並列処理できるし。マルチコアを使い切ることも可能。
2019/12/12(木) 19:06:01.30ID:CkUjiG2X
>>217,218
お前には聞いてない。最初からそう思っているおもいっきりばかにしたくてなんだろ?
そんなやつの言うことはww 変に勝手に決めつける点からも明らかに
2019/12/12(木) 19:23:11.97ID:AVYkL4QT
語彙がおかしくなってる(笑)
2019/12/12(木) 19:24:18.99ID:CkUjiG2X
こういうやつwww
2019/12/12(木) 22:51:40.18ID:1H8k0UmA
>>201
>>212

俺も作ってみた。
改良どころか根本的な書き直しが必要かもw
https://paste.ubuntu.com/p/wDwt8mWZrx/
2019/12/13(金) 02:20:43.65ID:ysGzQi5M
>>222
書いていて思ったけど、リンク先のやつ
s=$s" -negate" のsの使い方がわからんのよね
その後どう処理するか

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

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

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

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

cat<<HERE
Usage: ・・・

-a, --aaa aaaaaa
HERE
2019/12/13(金) 02:37:48.49ID:r2S5lo/C
HERE よりその文章全体の要約がUSAGEなので
END_USAGE とかにしたほうがちょっと読みやすい
2019/12/13(金) 03:28:44.87ID:ysGzQi5M
END_USAGEからはじまるで?
2019/12/13(金) 12:27:46.56ID:aQIhFndX
素人がここで訊くのはアレだがコマンドのオプションってなんでああもガバガバなの
lsは-hvlみたいにまとめられるしどこにでも指定できるじゃない
shortとlongで仕様を決めたらしいがfindからして従ってないし
ddはそもそも出自が違うらしいから異質でも納得だけども
2019/12/13(金) 16:35:44.26ID:oSsH2Kni
>>222
偉そうな言い方になるけど,もしあのスクリプトの
[ ${_helpcnt:-0} -ge 1 ] && \
{ optdoc 'オプションtの解説'; continue; }
という部分が
helpdoc 'オプションtの解説'
みたいに一コマンドで完結していれば使いたくなったかも。
ところが関数の中でcontinueを使うと効果なくなるのよね……w
2019/12/13(金) 18:58:27.09ID:ysGzQi5M
個人的にはgetoptsはロングオプションが使えないから
それだけで候補にはならんなぁ
かと言ってgetoptはロングオプション使えるけど、
数を増やすと一行がどんどん長くなってしまうw
2019/12/13(金) 19:44:00.66ID:oSsH2Kni
寧ろgetoptはPOSIXに準拠しなくなってしまうから嫌だな。
コマンドの主要な部分でどうしても非POSIXコマンドに頼らざる得ないとかならともかく
オプション解析っていう割と副次的な部分の機能を高めるが為にわざわざ標準から逸脱したくない。
(あんまり拘るとキリないけどw)
2019/12/13(金) 19:51:43.71ID:ysGzQi5M
あ、getoptが良いって言ってるわけじゃないよw

getoptはロングオプションが使えるってのは
一見良いように思えるけど、引数が長くなるから
getoptsが一文字なのは、あえてそうなってるかもなってこと
2019/12/13(金) 19:55:08.60ID:ysGzQi5M
あとgetoptsもgetoptもだけどさ
使うことでオプション解析って楽になってる?
使わないで独自解析してるのも見かけるけどそれと大差ないように感じる
何が嬉しくてgetoptsもgetoptを使うんだろう?
2019/12/13(金) 21:32:49.16ID:oSsH2Kni
そりゃ多少なりとも手間が省けるからじゃない?
たしかに結局whileやらcase文やら多用してるから大差ないように思えるけど
-abc←こういう一つのハイフンの後に複数のオプションが指定されている場合を考慮したり
オプション引数があるときはshiftする個数変えたり……
みたいなことは少なくとも俺のような頭の弱い人間には保守・管理しにくい。
経験上,getoptsが使われている場合は,
自前でオプション解析してる場合よりも常套的な構文が使われてる(もうほぼほぼwhileとcaseの入れ子)
から,gettoptsによるオプション解析の部分は読み飛ばしてもOKっていうのは気分が楽w
2019/12/14(土) 11:52:21.09ID:gTK06/8e
POSIX man(開発段階)の仕様書に
各企業が「よりよいヘルプ体系」(“better help system”)を付け加えることに意欲的である
っていう文章があるんだけど
このよりよいヘルプ体系について具体的に論じてるページとか知りませんか。
2019/12/14(土) 12:02:40.53ID:q2HhYeOb
ドキュメントはもうウェブサイトで用意したほうが良いよ
2019/12/14(土) 20:55:20.00ID:gTK06/8e
$ man foo
please see http://example.com/foo

ってかw
ネットワーク環境がなかったり貧弱だったりする環境は無視ですかい?
2019/12/14(土) 21:20:20.57ID:6YH7rFov
オフラインダウンロード機能でもあればいいだけじゃん
manの表現力は低いわけだし、いまどき画像表示できるマシンを
誰だって持ってるのに、テキストベースに拘る必要はない

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

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

古いバージョンのドキュメントは、新しい機能のことまで書いてないしね。
ドキュメントは分離して最新のものを常に更新していったほうが良い
2019/12/14(土) 23:05:33.87ID:gTK06/8e
まあ「いつのバージョンについていつ書かれたものか」みたいなのは簡単に確認できるようになるといいね。
RDFとか利用するとWebとの相性も良さそう。
2019/12/15(日) 02:19:32.16ID:a0yEED8b
>>237
バージョン間で違いが大きすぎるのは別として、
ドキュメント一つで全バージョンを網羅すべきだと思う
このオプションはバージョンいくつ以上から使用可能ですとか

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

シェルでもdash用とかbash用とか別々に作るのは無駄だよ。
この機能はbash専用ですとか書いてあれば、一つ見るだけでよくなるし注意点もわかる
別々に作られてたら、あれこれdashで使えるんだっけ?とかなるし
2019/12/15(日) 03:19:52.38ID:woT0VW+T
ソフトウェア作ってるのはそんなの気にしないだろう
拡張部分で同じだがちょっと違うとは普通にあるのだし
やるのは他の誰か必要と思ったのがやるもんだろな、たとえば>>238
2019/12/15(日) 04:20:02.09ID:3SLEzfiL
>>238
昔のバージョンの動作に問題があったとしても、そこに誰が手を加えるのかって話があるのでまとめるのには無理があると思う。
いつ書いた物で、その当時の最善を尽くした、がお互い(作る方と使う方で)
許容できる最善手じゃないのか?まあつまり>>237の言ってることだがw
2019/12/15(日) 04:35:07.70ID:a0yEED8b
>>240
wikipedia方式で良いんじゃね?
2019/12/15(日) 10:01:39.28ID:E44EqLgR
Wikipedia方式ってのがよく分からんけど
かなり自由に編集できて,既定で最新版が表示されるけど変更履歴が辿れるっていう方式ならいいね。
↑これはwiki全般に言えることだから寧ろコマンドwikiって言ったほうが適切か。

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

という訳で誰かそういうwiki作ってw
2019/12/15(日) 11:36:59.02ID:pTp+dpJs
必要性を感じた者がやるんだよ! 頑張れ!
2019/12/16(月) 00:44:09.03ID:5wUpgmce
日本語manだけ更新日が1990年代
英語manだけなぜかBSD版
--helpと言ってることが違う
これ食らってから正直manには期待していない
infoの日本語化って無理なのか?あっちも使いにくいが
2019/12/16(月) 07:48:45.99ID:4GuGuHT1
逆になぜinfoは信頼できると思ったのか
2019/12/17(火) 13:48:36.21ID:BxEORdhA
infoを使用すると完全なマニュアルを読むことができるはずだ。ってmanにあるくせにそれ言うのか
247デフォルトの名無しさん
垢版 |
2019/12/17(火) 22:02:31.85ID:kdkfgKcy
>>244
なければ作るとよい
2019/12/18(水) 18:56:56.67ID:Cw3S1jU2
manはそんなに難しい英語ではない
マニュアルとしてはとてもよく書けている
これを英語で読めないんだと、そもそもマニュアルを
読み取るのが難しい国語レベルかと
2019/12/18(水) 19:39:48.69ID:uFDqtnkl
日本語の問題とman自身の問題は別の話でしょう?

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

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

アプリとそのマニュアルは本来別でリリースすべきなんだろう
2019/12/19(木) 10:03:23.50ID:y7Q/2NKF
マニュアルとプログラム本体が一緒くたにされてる今でもマニュアルの内容が古いとか
書いてることと実際の動作が違うとか問題が多発してるのに
分けようなんて言いだしたらもはや二者の乖離が酷すぎて、だれもマニュアルなんて読もうとしなくなる
……っは!もしやそれが狙いか?w
2019/12/19(木) 11:24:35.20ID:belDjs1+
まぁ指摘される度にお前がやれだの英語で読めだの言うけどそれ諦めてるよね
逃げ口上というか捨て台詞というか負け惜しみというか
2019/12/19(木) 16:35:50.82ID:jArWapvD
OSS
言い出しっぺがやるというだけだろ
指摘ってなにが目的なんだか。俺がか?
2019/12/19(木) 18:30:09.45ID:4hkxYlHE
bashで関数名に使える文字と使えない文字ってこれであってる?

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

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

何だこのカオスwww
2019/12/19(木) 18:38:08.39ID:UoMpZOx6
関数名には記号を使わないのが基本だ
使っていいのは _ ぐらい
あとは紛らわしくてしょうがない
可読性が著しく下がる
2019/12/21(土) 20:28:47.93ID:X9+p8H27
func() {
 foo "123$@"
}

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

func() {
 tar "v$@"
}

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

はー、よくできてんなー。
シェルスクリプトってなんとなくいきあたりばったりで
作られたように見えるのによく練られた仕様だと思うよ
2019/12/22(日) 11:21:06.45ID:JDtuJK73
むしろそうじゃない方が例外的な動作で奇妙に見えるけど
""の内側で$@は引数に展開されるし
"str$var"←こういう引用符だったら文字列と引数はくっ付いて表示される。
2019/12/22(日) 11:45:14.20ID:JDtuJK73
sedでC言語中の#includeディレクティブを無効化したいんだけど
sed \
-e ':a' -e '/^#[[:blank:]]*include.*\\$/N;/\\\n/d;ta' \
-e '/^#[[:blank:]]*include.*/d'
↑これで対処できるかな。
2019/12/22(日) 12:51:34.17ID:O05uH48x
>>256
他の言語だったら、文字列+文字列の配列 の場合に
エラーかもしくは配列の要素が一つ増えるって考えるでしょ?
文字列の配列の一番目に、結合されるって仕様はなかなか思いつかないと思うよ
2019/12/22(日) 15:12:02.64ID:JDtuJK73
>>258
なるほど。

ただ、$@って配列変数じゃない気がするわ。
単に引数が空白区切りで格納されてるだけで。
↑じゃあ配列と何が違うんだと言われると難しいけどw
配列だとおこりえない挙動を示せるいい例が思い付かないので。
2019/12/22(日) 15:49:52.02ID:9GUBQyj0
>>257
t は s の結果に依存するのでそこで使うのは適切ではないと思われる。
sed でやるならこんな感じか。

#!/bin/sed -f
/^#[[:blank:]]*include/!b
:L0
/\\$/{N;b L0}
d
2019/12/22(日) 16:03:17.69ID:XO28QfbO
削除じゃなくてコメントにしちゃうとか

sed -e '/^#[[:blank:]]*include.*\\$/,/[^\\]$/s:^://:' \
-e 's:^#[[:blank:]]*include://&:'
2019/12/22(日) 17:46:01.65ID:O05uH48x
>>259
$1、$2でアクセスするし、その$1に空白入れる事も
できるんだから配列は配列だよ。空白区切りじゃない。

bashでは$@の名前付き版$NAME[@]は
明確に配列と言われてるしね
2019/12/22(日) 18:25:06.92ID:M+q9E136
>>255
必要な仕様というよりシンプルな文字列展開としてはそうなるというだけでは
その例はたまたまそういうように使えるというだけのような
あえて賢い対応してるなと言うなら "v""$@" とか書く必要がないとこかな
2019/12/23(月) 15:40:09.98ID:YJsAIsu8
シェル組み込みのgetoptsを同一処理内で二回以上用いるときに
$OPTIND変数を初期化してないと、前の結果が引き継がれてるせいでおかしな挙動になる

dashみたいにgetoptsを内蔵していないシェルでは
外部コマンドとしてgetopts(1)を起動した瞬間に$OPTIND変数が初期化されるみたい。
BashやらKshみたく組込みgetoptsを内蔵してるシェルの、
それも関数を跨がない処理
(getoptsを使ってる関数から一度も抜けることなく再度使用)
の時だけ$OPTIND変数が初期化されないみたいで、
そのせいで不本意な挙動の原因が掴めず半時間ほど無駄にしたw
(dashだと問題ないし、Bashでも特定の箇所でだけ不具合が生じるから)
2019/12/23(月) 15:55:18.14ID:YJsAIsu8
>>262
どういう要件を見たせば
ある変数が配列変数だって言えるのか知ってる?
(俺は知らん。でもプログラミング言語論とかで定義されてそう)
$@がその要件を満たしてれば配列に違いないね。

でもそういう明確な定義が無いなら
もう個人の勝手なんじゃないかな。
2019/12/23(月) 16:20:51.38ID:CGg4xw4r
>>264
> $OPTIND変数を初期化してないと、前の結果が引き継がれてるせいでおかしな挙動になる
当たり前だな。どこに状態を保存してるのかと

> dashみたいにgetoptsを内蔵していないシェルでは
は?内蔵してるが?おそらく初期版から。
getoptsを内蔵してないのはbusyboxで
意図的に外してビルドした場合ぐらいだろ
2019/12/23(月) 16:22:45.93ID:CGg4xw4r
>>264
何を言ってるのかわからんが、検証が間違ってる
2019/12/23(月) 16:36:13.95ID:YJsAIsu8
>>267
あ、そうなの。
じゃあdashの組み込みgetoptsが何らかの
形でBashやKshのそれと$OPTIND変数に対する処理が違うんだな。
ともあれ単純に初期化すればいいだけなんで、
事もないよ。
2019/12/23(月) 16:37:34.35ID:CGg4xw4r
だいたい$OPTINDはシェル変数なんだから、
getoptsは外部コマンドとして実装するのは不可能なんだよ

どうやってシェルスクリプトから実行された外部コマンドから
呼び出し元シェルスクリプトの
プロセス内のメモリを書き換えるんだよw
2019/12/23(月) 16:40:45.68ID:CGg4xw4r
>>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.
2019/12/23(月) 16:43:06.84ID:CGg4xw4r
bashやkshはローカル変数にでもなってるんだろ
2019/12/23(月) 20:47:02.60ID:sS1JWXeN
ぷぷぷ、ぷろぐらみんぐ言語論wwwww
2019/12/23(月) 20:50:03.01ID:YJsAIsu8
>>269
え、そうなん?
じゃあ
https://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html
↑getoptsはここには載ってるけれども
実質としては組み込みコマンドとして実装するしかないのか。

ありがとう!勉強になったわ。
2019/12/23(月) 22:11:39.28ID:gENEPh5i
>>273
そこに乗ってるのは確かに気持ち悪さがあるけどね。alias、cd、readあたりも。
まあプロセス間通信などを使えば、外部コマンドとして作るのは
絶対に不可能というわけじゃないがまずやらんだろうなw
2019/12/23(月) 22:26:33.99ID:EXKdfS/F
大昔は cd が外部コマンドだったと知って吃驚仰天
276デフォルトの名無しさん
垢版 |
2019/12/24(火) 11:07:35.47ID:mQqeuoCV
そんなバナナ
2019/12/24(火) 11:10:44.79ID:8h2rOUkn
https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32549&;forum=6

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

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

# にもかかわらず外部コマンドのcdを持っているUnixがあるのは何故だろう?
# joke ?
2019/12/24(火) 11:11:40.76ID:8h2rOUkn
https://tutorialmore.com/questions-292990.htm

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

解決した方法 # 1
主に、シェルの
2019/12/24(火) 13:50:24.53ID:lTGNfo7C
POSIXシステムには外部バイナリ cd があります
ないけど…?
2019/12/24(火) 17:56:12.00ID:O0jTO9nR
WSLのUbuntuにもない。
281デフォルトの名無しさん
垢版 |
2019/12/24(火) 18:31:17.89ID:mQqeuoCV
というか、あったとしてどうやって使うのか?
282デフォルトの名無しさん
垢版 |
2019/12/24(火) 18:35:06.35ID:mQqeuoCV
カレントディレクトリを移動してから何か実行させたいならそのcdコマンドからexecしない限りできんよな?
とするとそのcdコマンドはディレクトリだけでなく実行するコマンドを引数として受け取るのか?
2019/12/24(火) 20:48:55.98ID:uCBqTgFr
>>278 が出ているのに。あまり使い道がない例だけどな
2019/12/24(火) 21:07:13.05ID:uCBqTgFr
https://pubs.opengroup.org/onlinepubs/009695399/utilities/cd.html
APPLICATION USAGE
最初にビルトインに決まってるという説明の後で、ほぼ同じこと書いてあるやん
例が実行できるようにするには必要で、これはできないとは書いてないからあるのが仕様内だろう、たぶん
こんな使い方しねーよで無いんじゃないの、Ubuntu(Debian?)などは
285デフォルトの名無しさん
垢版 |
2019/12/25(水) 17:49:11.61ID:DcKuxkE0
なるほど
2019/12/25(水) 18:50:00.73ID:N+K1pmuB
シェルのバックグラウンドジョブと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と表示)に
させるにはどうすればいいでしょうか。
どうかご教示ください。
2019/12/25(水) 19:25:32.89ID:GfHtMQ6w
シグナルハンドラはデフォルトの動作があらかじめ決まってる
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 $!
とか

シグナル実行抑止遅延とかあったかなあ
2019/12/25(水) 19:36:59.98ID:N+K1pmuB
>>287
ありがとうございます!
無事解決しました。
ところで (すでに問題は解決できたので)単なる興味本位なのですが、
trap -- 'kill -s QUIT $!' USR1; { trap -- 'echo trapped; exit' QUIT; kill -s USR1 $$; echo start; sleep 5& wait $!; echo end;
}&
↑これだと問題ありますか。
素人目線では上手くいくような気がしますが、子プロセスを殺すtrapを親プロセスの前に仕掛けてるあたりが
マズい気がします……。
(ちなみに手許では>>287様が示してくださったものと同様上手くいきました)
2019/12/25(水) 19:39:42.14ID:N+K1pmuB
>>288
これは取消します。
これではいかなる場合でもtrapが実行されちゃいますね。
すいませんでした。
2019/12/25(水) 19:59:14.64ID:GfHtMQ6w
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使って、ループが無くなってちょっとスッキリ版
2019/12/25(水) 20:09:25.33ID:v8ePSHs/
>>286
> { trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }& kill -s QUIT $!
> 何も出力されなくなります。

コアダンプって出力されるよな?
2019/12/25(水) 21:22:56.22ID:rkHGbRnb
一行で書くから見づらいったらありゃしない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 $!
2019/12/25(水) 22:03:53.28ID:N+K1pmuB
>>291
うーん。すいません。
恐らくシステムか何かがコアダンプを生成しないようになっているようです。
コアダンプはありませんでした。
2019/12/25(水) 22:28:14.59ID:iUDS0c82
ulimit -c unlimited
295デフォルトの名無しさん
垢版 |
2019/12/25(水) 22:29:25.06ID:ixBqsT77
このスレにtrapでソフトタイマを作ったのが載ってるよ。
2019/12/25(水) 22:40:18.77ID:rkHGbRnb
>>295
もうやめたれwww
2019/12/26(木) 00:40:43.87ID:uF/G2OAQ
いちゃもんつけながらでないと自己表現できない自分が確認できない、いつものやつ
2019/12/26(木) 00:57:23.99ID:0kHOyMkL
>>297
わかるように結構工夫して書いてるんだぜw
2019/12/26(木) 00:58:24.91ID:uF/G2OAQ
質問主も応えてるのもわかってるけどな
2019/12/26(木) 00:58:56.93ID:0kHOyMkL
「俺」を否定することはできても
「レス」は否定できないやろ?w
>>292とかシンプルで美しい回答だからな
2019/12/26(木) 01:01:09.61ID:uF/G2OAQ
自己満wキモいわ自分で言うか
すげえな。これ以上何を言っても通じないな
2019/12/26(木) 01:03:25.32ID:0kHOyMkL
そうそう俺を叩いた所で無駄やで。煽り耐性レベルMAXだからな
そんなくだらないことよりレス(シェルスクリプト)の話をしようや
2019/12/26(木) 10:54:33.00ID:zbYMFUyq
>>292はいいな。タイムアウトまで実装できてる
>>287とか>>290だとバグで通知が行われないとフリーズしてしまうが
>>292だと一定期間でタイムアウトになって処理を継続できる
2019/12/26(木) 12:41:29.91ID:MI1/ojN2
>>292だとどうしても1秒間停止してしまわない?
echo trappedを(適切に)実行する準備が整い次第速やかにkill QUITしたいんじゃ
なかったっけ?
>「sleep 1を付けると(シグナルハンドラを設定するスクリプトが起動する猶予が生れて)
start→trappedが出力されるけど、sleep 1を取っ払っても作動するようにしたい」

>>287の実装が一番良いな。
シグナル受け取り側の準備が出来るまで実直に待ってるから余計な待ち時間はほぼ発生しない。
sleep <小数点>はBash拡張ってのが玉に瑕だけどもともとBash前提だから問題ない。
2019/12/26(木) 12:47:29.21ID:zbYMFUyq
>>304
よく読んでみて、停止しないでしょ?
必要最小限しかwaitしない

>>287だと0.1秒待つことになるが
そんなに待たないし、ループで負荷をかけることもない
2019/12/26(木) 12:51:43.96ID:zbYMFUyq
仮にwaitする前にsleepが(一瞬で)killされたとしても
wait ${すでにいないPID} を実行してもエラーにならないんだよね
2019/12/26(木) 13:26:19.54ID:zbYMFUyq
>>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 $!
2019/12/26(木) 14:16:08.46ID:MI1/ojN2
>>305
あ、kill $SLEEPを読み飛ばしてたw
すまん。
2019/12/26(木) 15:10:05.95ID:W7puUhWv
自演w連投ぶりからいつもの
2019/12/26(木) 17:04:03.21ID:uIk/XshQ
自称神様の降臨か
2019/12/26(木) 17:46:42.36ID:W7puUhWv
ずっと居ついているだろ
2019/12/26(木) 20:40:26.24ID:VT4/hGaE
ただいま。ってかお前ら何やってんの?w
また俺じゃない人に絡んでるようだが
2019/12/26(木) 20:57:57.00ID:GKWkZChC
わざとらしすぎてわろた
2019/12/26(木) 20:59:56.60ID:VT4/hGaE
違うから違うって言ってるんだけどなw
2019/12/26(木) 21:06:21.96ID:GKWkZChC
はいはい
同じ反応速度、普通のスクリプトでわいわいなレスに対していきなりな同じ態度レスで絡む
同一人物でいいだろ。そんな辺なやつはそう居ないと思うけど
2019/12/26(木) 21:08:13.76ID:VT4/hGaE
意訳 俺以外はみんなあいつ
2019/12/26(木) 21:08:43.19ID:VT4/hGaE
俺の敵はみんなあいつ
の方が良いか
2019/12/26(木) 21:12:56.47ID:GKWkZChC
連投wその連投ぶりのレスの内容といい
特徴的な共通点が多すぎ
2019/12/26(木) 21:35:49.17ID:VT4/hGaE
>>307
俺もやってみたけどQUITじゃたしかにdashで動かないね
確かめたつもりだったけど

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

と思ってkshでやったら動かんかったわw
kshではsleepはシェルビルトインなんだな
2019/12/27(金) 09:20:57.82ID:NrzsOb0y
横だけどQUITって使うことってある?
OSとかデバッガ系なら使うことあるだろうけど
アプリでは使わないほうが良いんじゃいかな?
2019/12/27(金) 13:14:28.69ID:GMT90LLU
>>320
それはなにか理由ある?
2019/12/27(金) 21:58:46.84ID:jjhZE+Ou
QUITってコアダンプさせるためのものでしょ?
2019/12/28(土) 12:47:18.40ID:/Zzxwqbk
POSIXでは基本的にTERMとほぼ同じだけど
XSI拡張では「なにか他の動作を追加的に行ってもよい」とあるな。
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
2019/12/28(土) 23:26:23.77ID:lWCFWx/Q
QUITをトラップするとコアダンプ機能が使えなくなるというデメリットがあるね
普通はQUITでコアダンプするわけだから、あれ?コアダンプできない?ってなるかもしれない
コアダンプを明示的に生成する方法あるのかな?
あと、もしかしてdash、ksh、yashだとQUITってtrapできない?
trapしても何も動作しない
2019/12/29(日) 01:40:48.31ID:FmabBrht
dash,kshはQUITでtrapで動いてるけど。yashは試してない
2019/12/29(日) 01:53:56.90ID:MrCxy9bb
#!/bin/sh
trap 'echo trapped; exit' QUIT
echo $$
sleep 60


これを、sh test.sh & ってやって
表示されたプロセスIDに対してkill -q QUIT プロセスIDって
やっても何も表示されないんだけど、どうやって確認した?
2019/12/29(日) 02:02:29.22ID:FmabBrht
sleepというかコマンドが実行が終わるまでtrapで設定したのは動かないよ
2019/12/29(日) 02:10:00.25ID:FmabBrht
なんか言い方が変だな。POSIXでそのような文が書いてあったと思うそのまま書いた
コマンドが実行中はシグナル受け取っても実行されない、コマンドが終わってから実行
for i in $(seq 60); do sleep 1; done
とかで動くでしょ
2019/12/29(日) 02:13:23.19ID:MrCxy9bb
あれ?なんかおかしいね。
じゃあ>>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 $!
2019/12/29(日) 02:14:47.34ID:MrCxy9bb
>>328
つまりコマンド実行中はtrapしていても無視されて
強制終了してしまうってこと?
2019/12/29(日) 02:17:11.43ID:FmabBrht
無視ではなくて保留だな。受け取っていることは受け取っている
2019/12/29(日) 02:19:29.79ID:MrCxy9bb
保留だとしたらkill -s QUITした時点で終了するのはおかしいはずだが?
2019/12/29(日) 02:25:16.44ID:FmabBrht
>>329
shって?dashでいいの?表示されたけど
強制終了ってなにをいいたいのかわからん
dashはtrap中の標準出力にクセがあるかな?dash起動してコマンドラインでtrapでechoして、他からシグナル送っても出力されないリターンキー叩いたりしたら出る、コマンドラインではね>>329はそうならんけど

>>332
なにを言いたいのかわからん。>>326は解決したんだろ?
強制終了と思い込んで次の展開されても困るぞ
2019/12/29(日) 02:31:00.58ID:MrCxy9bb
>>333
全ては>>329でdashとbashで動作に違いがあるってことだよ
強制終了は強制終了。そのまんま終了してしまうってこと
2019/12/29(日) 02:46:04.76ID:FmabBrht
強制終了自体してなくないんじゃないの
なぜかスクリプトファイルとして実行すると、dash/kshではサブシェルのtrapが動いてないな>>329
シグナル無視なのかなんなのかendまで動き終わる

>>326はそんなんじゃなくて、単なるシンプルな間違いで、違いもなんもないけど
2019/12/29(日) 03:24:42.26ID:QzTL60WW
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.46ID:xfr0s5Fj
PowerShell最強説
2019/12/31(火) 08:44:50.09ID:qHnQy48w
諸説あります
2019/12/31(火) 15:40:24.49ID:F82oxaIy
※個人の感想です
2019/12/31(火) 23:33:05.25ID:vVhGTaaB
僕もPowerShell愛用しています。
これを使い始めてから人生茨色です!
2019/12/31(火) 23:43:55.86ID:tLgKzi5A
人生の道が茨で埋め尽くされております!
2019/12/31(火) 23:48:11.73ID:9cUyZ2YF
※ 来世にご期待下さい!
343デフォルトの名無しさん
垢版 |
2020/01/01(水) 08:19:52.80ID:6zSEt3Eo
>>337
使用されることが最強に少ない感
344デフォルトの名無しさん
垢版 |
2020/01/02(木) 13:42:39.95ID:ZoBKtk8g
例えば/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

という表示が出てくるのですがこれを表示させない方法ってありますか?
2020/01/02(木) 13:59:42.22ID:Ifo0PTAe
Bugzilla に登録されてるね。

Gecko_IOThread] WARNING: pipe error: Broken pipe: ... ipc_channel_posix.cc
https://bugzilla.mozilla.org/show_bug.cgi?id=1550919
2020/01/02(木) 14:17:59.62ID:ZoBKtk8g
>>345
つまり標準ブラウザ変えるかchromeとかにすれば良い感じですね。pipe errorとか connection reset の方で検索してました、ありがとうございますm(_ _)m
2020/01/02(木) 18:23:50.86ID:8+JZKzet
>>345
プログラム板の鑑みたいな人だな
凄い
2020/01/10(金) 15:59:20.38ID:pZwemz/Y
GNU sedって一応POSIXに準拠してるけど、色々拡張機能もあるじゃん
こういう拡張機能がほとんど無い、純粋にPOSIX標準に準じたようなsedやらawk、bcなんかの実装ってある?
2020/01/10(金) 16:05:57.94ID:c8NDboJX
GNU sed, GNU awk には --posix オプション、GNU bc には --standard
っていうオプションが用意されている
2020/01/11(土) 08:05:41.49ID:IVNUyUW+
知らんかった。ありがとう
351デフォルトの名無しさん
垢版 |
2020/01/11(土) 21:29:54.53ID:9SPVzhvj
やっぱzshクソ。pathとかstatusが特殊変数なのやめてくれ。
しかも大文字と小文字区別しねーし
path=hogehogeってやったら、環境変数PATHから検索しなくなる。
command not found!
2020/01/11(土) 23:34:38.48ID:NBzz9dXo
単にいままでのに慣れて違いを受け入れないってだけだな
2020/01/11(土) 23:39:31.73ID:NBzz9dXo
なんだ、単に zsh = ksh + tcsh ってのを理解してなくて的外れな文句言っているだけじゃん
アホらしい。文字通り
2020/01/12(日) 08:42:02.61ID:QbL/hexX
なんでそんなに攻撃的なんだよw
355デフォルトの名無しさん
垢版 |
2020/01/12(日) 09:36:05.07ID:FpBV3Lt5
>>1より
> ・csh/tcshでのシェルスクリプトは*まったく推奨しません*

>>353
> なんだ、単に zsh = ksh + tcsh ってのを
kshにまったく推奨しないものを加えたら、クソになるんじゃないですかねぇ(笑)
356デフォルトの名無しさん
垢版 |
2020/01/12(日) 09:39:05.21ID:u1ffAIxu
あと、環境変数の大文字と小文字は区別されてるのに
PATHに関してだけ区別されないのはどう考えてもクソだと思いますよ

pathに代入してもPATHが変わるってどう考えても
存在理由がない機能でしょw
2020/01/12(日) 11:22:16.69ID:QbL/hexX
まるでwindows…
2020/01/12(日) 17:34:52.15ID:J9pO5B5T
そんなに不満があるなら誰かがフォークしてそれがメジャーになってるだろ
俺が正しいって言ってもお前の頭の中ではだな
2020/01/12(日) 18:17:26.10ID:QbL/hexX
せやな。

事実一番メジャーなシェルはBashだしね。
2020/01/12(日) 18:54:12.07ID:J9pO5B5T
読めない自己紹介にしかなってないな
2020/01/12(日) 19:23:15.19ID:J9pO5B5T
>>356
わざわざ後付けで書いてあるのに根本的に何も理解しようとしてないだけだな
大文字小文字を判断してないじゃないよ、
PATHは単なる文字列pathは配列、
pathはcsh特有での、
PATHとpathという別の2つの環境変数
shモードcshモードを切り替えてなんていう実装ではなくちゃんぽんの可能な実装なので、PATH/pathをどちらか変更したら相対する方にも同期するというのだろ。そもそもcshでのpathがそういうものらしいが
内部的に参照しているのはpathの方かな。同期されない特定状態の場合から(どういうときか探してみようw)

今まで使っていたのと違うというだけじゃ話にならない、俺が正しいって言ってもお前の頭の中ではだなでしかないということ(>>355なんてそれが甚だしいけどw)
2020/01/12(日) 21:32:38.39ID:UPYAUoGA
cshがーっていうけど、zshとcshに互換性はまったくないじゃん
真似しなくていいものを真似した結果、貴重な短い変数名が
使えなくなってしまったことに違いはないんだけど
2020/01/12(日) 21:53:04.90ID:J9pO5B5T
作りもしないのに何を文句だけ言っているのだか。そんなに俺が偉いしたいの?
This is a shar file containing zsh, a ksh/tcsh-like shell.
というコンセプトで始めてるんだよ、その成果が認められているのは有名ディストリでもパッケージとしてあるんだから明らかだろう

そんなに俺の考えたのが最強なら作ってみればいいじゃん、フォークしてでも。世界に名を轟かせるいい機会だぞ、こんな匿名で偉そうに評論してんじゃなくw
2020/01/12(日) 22:07:46.46ID:7H3TRCXg
zshのクソ機能をクソ機能と言っただけで
なにファビョってるんだろう?

お前が作ったわけでもないだろうに
バカにされたとでも思ってるのか?
2020/01/12(日) 22:14:00.70ID:J9pO5B5T
クソ機能をクソ機能と言えるほど全然賢くないのが明らかなのに、自覚のないヤツ(ら?)だなあという。自覚がないようだからでしかないんだがな

いや、そのコメでますますアレでしかないなあ。自分は何かをクソと呼ぶが、自分が同じように呼ばれると聞かないって、じゃあ、そもそもどういうつもりでクソと呼んでいるのか?哲学だよww
結局俺偉いだけもしくはただの根拠のない感情だけだから、俺が自分自身と同じだと思ってそんなコメすんだろな?としか思えんけど
2020/01/12(日) 22:26:10.29ID:7H3TRCXg
うわっw なんだろう、これ美味しくないって言ったら
お前は料理できるんか?みたいな反応

ただの評論家だろ、評論家は評論するな!
自分で料理しろ、自分で自分で絵をかけ、自分で歌を歌え
プロよりうまくなかったら、評価する資格なし。みたいな極端な考えw
2020/01/12(日) 22:29:57.49ID:J9pO5B5T
わざわざ不特定多数のとこで美味しくないという個人的感情を書く理由はなんなん
それに対して、そんなことないぞなぜなら〜と返しているのだが。なにか問題があるか?
料理調理の内容がというなら自分で作れというのはいたって当たり前だろう。不満があったら自分で調理するのがOSSだからな

結局俺偉いってだけで反論を許さない、なぜなら俺偉いからというだけかw
2020/01/12(日) 22:36:44.16ID:7H3TRCXg
> わざわざ不特定多数のとこで美味しくないという個人的感情を書く理由はなんなん

レビュー。Googleもやってるで
2020/01/12(日) 22:39:15.15ID:J9pO5B5T
ちょっと意味がわからんが、ああいうとこはやりとりはしないできないだろ
てか、ど素人かよ。スクリプトであってもまがりなりにも何か自分で作っているのに未だど素人かよと思ってしまうな、クレーマーレベルすぎてw
370デフォルトの名無しさん
垢版 |
2020/01/13(月) 05:57:08.53ID:iUioslZh
そんなに気に入らないなら自分で新しいシェル作れば良いのに。
2020/01/13(月) 06:56:27.50ID:00IYKkjv
信者の例

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

「設定」が使いづらい
→ そんなに気に入らないなら自分でOS作れば良いのに
2020/01/13(月) 12:47:53.36ID:cEXtDkBR
ナポレオン「私は卵を産めないが、卵が腐っていると判断できる」

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

ていうか他の人も指摘してたけど二三の欠点を指摘されただけで
まるで自分の人格を全否定されたかのような反応をするのってどういう感情なんだろう?
2020/01/13(月) 15:10:18.33ID:v+Mp6rDH
psコマンドで見て a.out で実行されているプロセスを全部 kill -9 してくれるスクリプトってどう書いたらいいですか
2020/01/13(月) 15:12:27.51ID:stzsvKPq
教えてあげないよじゃん
2020/01/13(月) 15:35:35.00ID:v+Mp6rDH
約に立たない2chのクズ共が自分で調べた方が早い

ps | grep "./a.out" | grep -v grep | awk '{ print "kill -9", $1}' | sh
2020/01/13(月) 15:47:43.19ID:GhUCXbF0
374は屑だが回答ないと豹変するのもどうかと
2020/01/13(月) 16:00:10.75ID:L1QEfUqR
killall でいいんじゃないかな
2020/01/13(月) 16:03:48.34ID:cEXtDkBR
煽って回答を貰うのはよく見掛ける光景だけど
煽りながら自己解決するのは珍しいなw
2020/01/13(月) 16:56:48.83ID:48BANHU6
zshはbashの強化版だと思ってたら違うのね
bashを覚えるので手一杯なんで他のシェルに浮気する余裕ないけど
2020/01/13(月) 22:41:06.83ID:ybxFvJaC
シェルスクリプトとしてはzshは使わないね。
bashとだいたい互換性があるシェル。
スクリプトとしてはPOSIX準拠にするかbashでしょう
2020/01/13(月) 23:52:57.18ID:HaVRjpT+
>>379
派生、元とした流れが全く違うからね
新しい機能つけるのに相互に参照してたり参考にしてたりするかもだが
2020/01/14(火) 00:50:43.36ID:/0srrHag
macでosアップデートしたらzsh強制になったんだが
2020/01/14(火) 03:49:13.20ID:GtH+RxOj
アップデートでは強制にならないよ
アップデートでなくても強制でもないし、単なるデフォ
2020/01/14(火) 16:08:03.31ID:5kcRpVJe
いつもの
https://i.imgur.com/Gn7TNci.jpg
2020/01/14(火) 18:06:08.65ID:Xjyusg2Z
>>384

>>2のリンク先にオリジナルが書いてあるから、
どこぞに転載されたものを貼り付けなくていい
2020/01/14(火) 18:09:26.71ID:Xjyusg2Z
この図 https://tangentsoft.com/misc/unix-shells.svg を見ると
zshはtcshを取り入れてると言うが、正確にはそれをやったのはKornShellで
その後継のksh88が、POSIX shellやbash等の現存する全てのシェルの祖先に
なるわけだから、zshと同様にdashやbashなんかもtcshを取り入れてることになるんだよな。
2020/01/14(火) 18:10:25.17ID:Xjyusg2Z
ksh2020でたからこの図更新してくれんかなw
2020/01/14(火) 18:46:58.03ID:3k/caRNi
kshってなんか凄いんだな

昔、AIXでksh書いた事あるけど
AIXぐらいでしかインストールされてる環境に出逢ったことない
Solarisでbsh書いてた後に触って配列使えて感動したのを覚えてる
また使ってみるかなぁ
2020/01/14(火) 23:00:12.31ID:eC6vK415
>>386
図だけで想像しすぎ
kshで取り入れたのはヒストリ機能などの極めて一部
そういろいろいうなら、ちゃんと調べた方がいいよ
2020/01/14(火) 23:05:01.84ID:eC6vK415
>>388
インストールというのならmacOSも昔から標準で入ってる
デフォルトログインシェルなのはAIXぐらいらしいね
2020/01/15(水) 00:00:09.35ID:kWU6CwmB
UNIXでbshができる
BSDでcshができる
改良版のtcshができる
bshにtcshを追加したkshができる
kshが商用だったので派生が拡がる
軽量版bshのashができる
Lnux版ashのdashができる
GNU版bshのbashができる
機能マシマシのzshができる
独立系のfishができる

こんな感じか
文字の修正とか昔のbashにはなかったらしいな
2020/01/15(水) 00:15:20.12ID:iV6SKP+H
デジャヴな適当なまとめレス
2020/01/15(水) 00:24:02.07ID:PiCqpD5C
fishは全然関係ねー
互換性がない別物
394デフォルトの名無しさん
垢版 |
2020/01/15(水) 07:03:57.56ID:kWU6CwmB
関係ないから独立系にしたんだけど
2020/01/15(水) 07:44:52.57ID:YlxQUfnE
それ依然に単に図を適当に日本語にしただけの説明なんてしなくていいから。
2020/01/16(木) 07:51:49.13ID:kJFHtYN8
TETって使ってる?
OpenGroupが配布してる適合テスト
2020/01/17(金) 08:13:43.25ID:z4CRALQ3
しらん
398デフォルトの名無しさん
垢版 |
2020/01/19(日) 08:08:23.81ID:q9WTUin1
例えば'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を表示する仕組みなんでしょうか…?
2020/01/19(日) 09:17:02.04ID:qcodQ+dh
$1, $2 などは、フィールド(列)変数。
$0 は、入力レコード(行)全体

こういう特別な変数に、代入してはいけない!
読み込む事だけに使うこと!
2020/01/19(日) 11:47:43.00ID:eoYSOV4S
それは言いすぎだろう。少なくとも gawk では何が起こるか明確になっている。
理解する気が無いならやらない方がいいというならその通りだ。
401デフォルトの名無しさん
垢版 |
2020/01/19(日) 19:39:38.50ID:JpGnQ0ST
シェル芸の定義って、スクリプトファイル作らないで、シェル(CLI)を駆使して
実用的ではないネタを披露すること。でいいですかね?

いやあまりにもくだらないネタが多いんで
2020/01/19(日) 19:41:53.38ID:rMML9kO3
何が言いたいんだか
403デフォルトの名無しさん
垢版 |
2020/01/19(日) 19:52:31.45ID:JpGnQ0ST
難読化シェル芸の解読
ながいPythonコードをシェル芸で実行させる
じわじわ広がる星型模様シェル芸
動く!電光掲示板シェル芸
ボディビルダーが泳ぐシェル芸
アイドルグループが46か48かわからなくなったときにワンライナーで解決する方法
鬼滅の刃の幾何学模様シェル芸
踊るgifシェル芸
ojichatグラフシェル芸
3の倍数と3が付く数字のときだけアホになるシェル芸
床屋シェル芸
闇シェル芸「さあ、闇のゲーム(シェルゲイム)の始まりだぜ!」
実践 キングウンコの作り方
画像っぽい素数をシェル芸でつくる
fish起動時にサイゼリヤ1000円ガチャの結果を表示する
【危険シェル芸】禁じられた闇の魔術とその防衛術??
2020/01/19(日) 19:54:37.30ID:ExWppFRM
>>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が作り直される風に
2020/01/19(日) 20:01:00.70ID:ExWppFRM
>>403
ふむ
それがくだらなくないレスなのか。読んだ時間を返せw
2020/01/20(月) 04:39:32.79ID:JFurewkA
>>351
っPowerShell
2020/01/20(月) 15:24:29.08ID:oVJVVsJQ
>>399 >>404
ありがとうございます、普通に動くから大丈夫だと思ってましたm(_ _)m
とりあえず今後は素直にprintで出力します
2020/01/21(火) 12:52:55.03ID:m6IPx8KZ
kshって今時だとninjaとか使うんか…
昔ながらのMakefileじゃないんだね
2020/01/21(火) 21:11:00.03ID:Mn6KsPak
教えていただきたいことがあります。
ワンクリックで複数のターミナルを開いてそれぞれで別々のコマンドを動かすスクリプトを書きたいと思っています。
gnome-teminalにオプションつけたらいけるかと思いますしたが、うまく行かなくて、、なにかアドバイスいただけないでしょうか
2020/01/22(水) 07:07:11.43ID:uCiji4On
gnome-terminal なら -- の後に実行したいコマンドを書けばいいだけみたいだけど
動いているが挙動がイマイチとかじゃないの?
うまく行かないって、そのままTerminalとしてウィンドウを残しておきたいとか引き続きインタラクティブでなんかしたいとか?
2020/01/22(水) 07:22:53.82ID:uCiji4On
GUI Terminalアプリは一般的にコマンドが実行し終えたらアプリも終える=ウィンドウも消えるという、まあそうなるか的な(まあshもそうだし)
gnome-terminalはオプションでウィンドウを残すようにできるが、なんかイマイチかな、出るべきものが出てないとか
gnome-terminal -- sh -c 'なんかコマンド;sh'
が確実に解りやすいかなあ

shで引き続きインタラクティブにするのには、--rcfile スクリプトファイル という変態的な方法で
gnome-terminal -- sh --rcfile スクリプトファイル
とかあったが、変態すぎてしないなw
2020/01/22(水) 20:17:38.02ID:IMIM4EWG
返信ありがとうございます!
具体的にはFIFOを複数作成した後に、
ffplay (作成したfifo) というコマンドを
fifoの数だけ開きたいのですが、数が多くて一つ一つ開くのは大変なので、スクリプトで一気に開けないかと考えているところです。
2020/01/22(水) 20:31:41.36ID:aGAY9ZaD
ffplayって自分で独自のウィンドウ開くんじゃないの?
全てバックグラウンドで起動する/動かせばいいんじゃないの?
ffplayが吐くログも同時に見たいとか??
2020/01/22(水) 20:38:59.30ID:0dPQnm43
>>413
説明不足ですみません、、
そうなんです、ログも同時に複数表示させたくて
2020/01/22(水) 21:18:09.64ID:aGAY9ZaD
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起動まで行かないけど
2020/01/22(水) 21:37:15.05ID:0dPQnm43
>>415
ありがとうございます!!
できました!
先週linux初めて触って分からないことだらけで、お手数おかけしました、、
2020/01/25(土) 17:35:52.15ID:2I6NhO3j
index=2,INFO1="abc",INFO2="ab,c"
↑こういう風に
「カンマ区切りで値が並んでて、区切り文字ではないカンマは引用符で囲まれてる」
みたいなデータに対して、
シェルスクリプトでINFO2やらindexやらの値を取得したいんだけどどういう方法がいいですかね。

IFSをカンマにする方法では引用符で囲まれてるカンマも区切りと見做されちゃうし…
シェルって""←の中を特別に扱う筈だから、evalとか使えば効率的に処理できそうなんだけど、
思い付かん…
2020/01/25(土) 19:29:47.91ID:nGGHbHoP
なんか前も似たような話があった気がするな
でもカンマ区切りでダブルクォートの中にカンマが含まれてるのかー
ってかCSV形式だなw

CSV関連のコマンドと連携させれば簡単に作れるけど
俺は使いたくないなー。というすると自分でパースするしか無いかなー
自分が必要なら最悪パースするけど、簡単な方法ないかなーw
2020/01/25(土) 19:31:22.74ID:nGGHbHoP
あ、IFSをカンマにしてから、evalに渡せばできるんじゃね?
2020/01/25(土) 19:32:25.51ID:nGGHbHoP
あ、evalじゃだめか。setがいるか
2020/01/25(土) 19:44:38.62ID:nGGHbHoP
setはいらんかったw
あとはスペースが入ってるときかー、どうやって対処するかな?
2020/01/25(土) 20:29:47.31ID:2I6NhO3j
>>418
CSV形式の一種なのかな。
ただ改行はなくて、常に一行。
あと引用符はあったりなかったりする。

具体的には、m3u8プレイリストの一部を処理したいのよね。
2020/01/25(土) 20:29:55.33ID:S3XsKqnt
プログラミング言語でやったことあるけど
もともとあるデータに手を加えられないなら
カンマを違う区切り文字に置き換えたかな
行解析ロジック入れたりもした

最近作ったシェルスクリプトだと
読み込むファイルをちゃんと設計して
そんなデータは行末に来るようにした
そしてwhile readで処理できるようにしてる
2020/01/25(土) 20:48:15.05ID:2I6NhO3j
超具体的に言うと(てかここまで直接に状況を晒すとクレクレみたくなるなw)

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

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

IFSを変える方法だとやっぱり引用符に関係なく「,」で区切られちゃうのよね
while read l; do
IFS=','; for s in "$l"; do
echo "$s"
done
done < ./playlist.m3u8
2020/01/25(土) 20:49:51.89ID:2I6NhO3j
>>423
自分で生成するんだったら区切り文字は絶対に
他の文字と被らないようにするんだけどね……
2020/01/25(土) 21:15:13.22ID:nGGHbHoP
面倒になったー

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

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

evalできるよ!

あとは頑張ってー
2020/01/25(土) 22:38:09.23ID:2I6NhO3j
>>426
それだと引用符の中のカンマまで変換されちゃうのよね。
まあ、もう簡単に処理する方法はあきらめて
AWKやらでガシガシ解析するしかないw
2020/01/25(土) 22:39:10.68ID:nGGHbHoP
>>427
戻せばいいよー
2020/01/25(土) 22:40:41.08ID:nGGHbHoP
んー?戻すとなったらset使ったほうがいいんか?

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

$1, $2,・・・代入されるからに処理しやすい
2020/01/25(土) 22:41:54.41ID:nGGHbHoP
> AWKやらでガシガシ解析するしかないw

シェルスクリプトでも普通にやればいいんだけどねー
一文字ずつ処理する方法さえ調べれば、
あとは簡単な普通のパーサー
2020/01/25(土) 22:43:30.45ID:nGGHbHoP
こういうのってawkで高度(?)な機能と発想の転換で使ってこなすより
1文字ずつ処理したほうが楽でわかりやすいよな
2020/01/26(日) 01:20:08.20ID:GaEtLwpN
GNU awk なら FPAT が使える

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

=> 2,"abc","ab,c"
2020/01/26(日) 01:26:07.97ID:gf7z5zyj
>>432
そういうやつね、高度な機能っていうのは
大体動くんだろうけど、仕組みを把握するのがだるいんだよね
仕組みっていうかどこまで動いて、どこが動かないのかの把握

大体動く精神なんだろうけど、それ使う側がそれで
納得できる前提だから、知らない人が使う場合困るんだよな
いざ問題が起きたら、対応が逆に大変になる
2020/01/26(日) 01:31:16.29ID:GaEtLwpN
いやぁ、こっちからみると eval や set を使う方がツラいわ…
2020/01/26(日) 01:38:47.61ID:3NTRDHS2
evalやsetは普通にシェルが文法を解釈するのと
同じ動きをするだけなんだからシンプルだろ

シェルの構文パーサー自体はしっかりと作られてるんだから
でもFPATはだいたい動くという理念で作られてる
2020/01/26(日) 01:48:36.68ID:GaEtLwpN
FPATって単なる正規表現(ERE)でしかないけどな。個人的には正規表現で
考える方が楽でいいし確実。以前に同じ様な事があったけど、

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

っていうリクエストがあって大変だったけど、結局 python の CSV パッケージ
を使って解決
2020/01/26(日) 02:14:38.87ID:3NTRDHS2
そもそも正規表現は単語(文字の並び)を見分けるもので
その単語の意味(このカンマはどういう意味?)を
見分けるものじゃないんだよ

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

コードをパット見てその意味がわからんのは
スパゲッティコードと大差ないよ
2020/01/26(日) 02:21:54.35ID:GaEtLwpN
eval 使うのは面白いけど、

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

fork_bomb=$(:(){ :|:& };:) なんて文字列を埋め込まれたら嫌だな…
2020/01/26(日) 03:03:54.87ID:GaEtLwpN
m3u8-file-parser(http://npm.taobao.org/package/m3u8-file-parser)なんてのがあるな
playlist のフォーマットって RFC8216 で定義されていたのね
2020/01/26(日) 09:15:52.32ID:EvZHCPY7
https://tools.ietf.org/html/rfc8216#section-4.2
属性列挙を解析したいって話か。
2020/01/26(日) 11:48:02.12ID:EvZHCPY7
>>427
AWKで解析するとして、コンマが引用符の中かそうじゃないかなんて判断できるのかな?
正規表現は>>423も言ってる通り単に文字の並びを指定するもので
ある箇所での文字の「意味」は定義できないからこういう作業には向いてなさそう。
442デフォルトの名無しさん
垢版 |
2020/01/26(日) 13:26:43.97ID:XFNlR92Q
てかお前らいつまで化石みたいな話してんの?
PowerShellやれよ
お前らが大好きなLinuxにもPowerShell入れられるように成ってるからw

もうこれからはハイパーVとかWindowsサーバーとかWSLできないと食ってなるぞお前らまじで
2020/01/26(日) 13:39:38.23ID:IghF1+Kj
Perl ならこんな感じか。

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

Perl にも CSV を扱うモジュールはあるけどね。
2020/01/26(日) 13:42:52.65ID:EvZHCPY7
ちょっとやろうとしてみたけど
_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パーサ?使うべきじゃないかなぁ。
2020/01/26(日) 14:11:49.86ID:GaEtLwpN
>>443
Perl(PCRE)だと non-greedy matching が使えるからいいよね
とすると GNU grep ではこんな感じ

grep -Po '((".*?"|[^,])+)'
2020/01/26(日) 16:19:39.04ID:5vRllc8t
なんかハマってるな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だけどエスケープするために結局パースが必要になる
2020/01/26(日) 16:34:10.53ID:GaEtLwpN
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
2020/01/26(日) 17:19:14.35ID:EvZHCPY7
<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属性値のみっぽいので,もういっそそれだけを区別して処理するのもありかも。
2020/01/26(日) 17:24:07.99ID:EvZHCPY7
中身のない連投すまんが,
処理する相手がRFC 8216に準拠したファイルだという前提があるとするなら
タグごとに挙動を変えるほうが賢いかもしれない。
というのもどのタグにどういう文字列が現れうるかということが規格に明記されているので。

>>446 ありえない文字に置換する手法もいいとは思うけど,そういう制御文字ってたいてい
<https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap06.html#tagtcjh_4>;に記述されている
非可搬な文字だから,ちゃんと運用する予定のスクリプトに入れるのは不安……。
2020/01/26(日) 17:29:07.81ID:EvZHCPY7
しっかし音楽・映像関連の処理をシェルスクリプトでやろうとしているとは,
そうとう変わってるなw

普通そんなファイルが存在して,かつそれらを自分で処理する=その後何らかの形で利用する
ような環境にいるんだったら,もっと色々やりやすい道具(PythonやらJavaScriptやら)もある筈よね。
シェルスクリプトで処理するしかないのは,貧弱な環境と単純なデータ構造に対してでしょうに。
(まあ>>1で「他の言語でやれ」は禁止とあるから,シェルによる処理を考えているけど)
2020/01/26(日) 17:42:41.77ID:GaEtLwpN
世の中には「ナントカ原理主義」を標榜する一派がいるのでな…
いや、この話題はやめておこう
2020/01/26(日) 17:54:10.76ID:5vRllc8t
>>449
非可搬な文字ってどういう意味?
ただの文字コードに過ぎないし、化けるわけでもなし
どんな問題があるのか全くわからんのだけど、

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

理論上でもいいからどんな問題があるのかを言ってくれないと
2020/01/26(日) 17:55:19.59ID:5vRllc8t
非可搬な文字を心配するぐらいだったらAWKのGNU拡張に対応してるかを心配するほうがより現実的w
2020/01/26(日) 18:45:22.92ID:EvZHCPY7
>>452
おっしゃる通り理論上の話で実際はほぼありえない(制御文字の使い方もほぼ統一されてるから)けど,
<DEL>文字が端末それ自体を制御する為のものだった場合,それが標準出力に出力された時に
端末自体に挙動が渡ってしまう。

> 文字に色をつけるときの...
事実色をエスケープ文字によって付ける方法はシェルの標準には載ってない。
2020/01/26(日) 19:38:00.94ID:5vRllc8t
>>454
別に<DEL>じゃなくてもいいよw
略称思いつかなかっただけだし、表示されて困る文字だからこそ
テキストの中に含まれてることはないだろという理由だし

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

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

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

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

いやだから、そういう理屈でいくと、
「色をつけるエスケープ文字も避けたほうがいいんじゃない?」って
言ってるってことでいいんだねって聞いてるんだが
2020/01/26(日) 23:27:21.62ID:2jcz6vHU
Ruby にも、CSV モジュールがある

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

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

逆に、ある時は、クォート文字で囲む。
その際、" だけは、"" と2つにする!
2020/01/27(月) 00:03:23.40ID:2UZekz3a
>>458
話の流れが分からない馬鹿は引っ込んでろ
2020/01/27(月) 00:15:59.79ID:Ad8VU0Ek
csvパーサー使えで終わる話を
延々とやってる暇人のほうがどう考えても馬鹿だと思うぞ
2020/01/27(月) 02:47:42.22ID:ZRdDiNHX
必要なのはCSVパーサーじゃないんでしょ?
2020/01/27(月) 08:20:17.15ID:bYuDSUjl
>>457

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

>>460
今の話はCSVの話じゃないよ,HTTP Live Streamingのファイル形式。
これはCSVの規格と違うもの。
2020/01/27(月) 12:19:59.05ID:3a7Xl2Zg
じゃあ可搬な規格がない文字を出力する
POSIX標準のtputはアウトだねw

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

なんで可搬な規格がないから使ったらダメになるのかさっぱりだw
2020/01/27(月) 12:49:44.28ID:YY6i47O6
>>463
どうやったら「避けたほうがいい。」が「使ったらダメ」になるんだ?
読んでるこっちの方のセリフだよ>さっぱりだ
2020/01/27(月) 13:00:46.30ID:3a7Xl2Zg
>>464
非可搬な文字だから,ちゃんと運用する予定のスクリプトに入れるのは不安
なんでしょ?その不安を解決するには禁止するしか無いじゃん

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


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

文字自体はポータブル(そもそもただの値でしか無い)
シェルスクリプトで使えないデータは 0x00 のみ(zshなど一部シェルでは使えるようだが)
2020/01/27(月) 13:02:14.15ID:3a7Xl2Zg
× 画面に表示した時の端末の挙動の話であることをあんたは理解してない
? 理解したふりして本質的な所が分かってない。理解が浅いから
話がつながってることが分かってない。それぞれ単独に知ってるだけ。
2020/01/27(月) 13:02:45.79ID:3a7Xl2Zg
文字化けした。ハテナではなくマル
2020/01/27(月) 13:02:53.97ID:bYuDSUjl
>>465
不安なのは俺であって>>464←こいつじゃない。
2020/01/27(月) 13:04:22.94ID:3a7Xl2Zg
知らんがなw IDなんか見てないw
2020/01/27(月) 13:09:39.68ID:J/l4gb9z
そこはちゃんと見ろよ。相変わらずオッチョコチョイな奴だw
2020/01/28(火) 10:45:44.35ID:kbn44J5i
シェルスクリプトでC言語みたく
do {...;} while ()
的な書き方できないかな。
つまり最初に条件無視して絶対一回実行されるっていう。
2020/01/28(火) 11:54:17.23ID:nzUBCcWX
while true; do
do_something
condition && break
done
2020/01/28(火) 13:32:33.77ID:wxWXUE5J
while
do_something
condition
do :; done
2020/01/28(火) 16:31:01.77ID:kbn44J5i
>>473
すげ。thx
475デフォルトの名無しさん
垢版 |
2020/01/28(火) 18:42:04.80ID:eRWskeVd
do {...;} while () はいらない子
476474
垢版 |
2020/01/28(火) 20:54:08.43ID:kbn44J5i
>>475
たしかにCでも>>472氏や>>473氏のような手法で
while (...) { ...; }
文で実現できるな…
2020/01/28(火) 21:18:03.61ID:G+y/1z2g
縁の下の力持ちだよ。
/usr/include で grep してみなさい。
2020/01/29(水) 13:54:11.80ID:B4xAwP+d
wc -mがUTF-8とかの文字列でも正しく判定できててビビった。
GNU系はともかく組み込み向けの実装では
絶対無理だと思ってBusyboxとかで試したんだけど、
全部正しい文字数を数えれてた……。

寧ろ喜ぶべきなんだけど、なんか釈然としない(foldとかがポンコツなのに)
2020/01/29(水) 14:12:22.86ID:sm4oITBd
逆にbusyboxは動くやろw

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

busyboxはPOSIX完全準拠を目指さない代わりに
「現実的な用途で動くこと」を目指してる。
UTF-8対応も現実的な要件の一つだよ
2020/01/29(水) 15:20:33.04ID:0dvwui3i
fold -w n に関しては LC_CTYPE=ja_JP.UTF-8 grep -Eo '.{1,n}' とかにするとか
2020/01/29(水) 16:06:00.43ID:9GJ5+8eT
Windows版busyboxも日本語処理なんとかしてくれないかなぁ。
cp932の処理がいまいちなのか、コマンド・プロンプトで使うlsでダメ文字のファイルが表示されないよ。
2020/01/29(水) 16:13:50.96ID:sm4oITBd
>>481
Windowsのネイティブ文字コードはUnicodeなのだから
cp932を使うのをやめればいいだけ
2020/01/29(水) 16:26:53.62ID:Q03p/42V
>>481
っ PowerShell
2020/01/29(水) 20:21:31.86ID:B4xAwP+d
>>480
grep優秀っすね…
2020/01/29(水) 20:22:55.72ID:UE7eyrg0
grepは俺が育てた
2020/01/29(水) 21:24:51.02ID:+kOHCQkf
>>482
cp65001 だと文字化けして使えない

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

最新のバイナリ(busybox-w64-FRP-3329-gcf0fa4d13.exe)でもだめ
2020/01/30(木) 22:29:51.66ID:uJZNpkau
なんで対処方法お母さんに聞かなかったの?

自分で対応できると思ったの 
2020/01/31(金) 07:54:20.77ID:aEgzRTpo
シェルスクリプトでaliasを使うことでしか実現できない挙動ってある?
コマンドを別に定義する方法って主に3通りくらいある
関数: somecmd() { ... }
別名: alias somecmd=...
変数 : somecmd=...
と思うんだけど、この内aliasに独特の特長ってあるのかな。
489デフォルトの名無しさん
垢版 |
2020/01/31(金) 09:38:38.09ID:fxx+hpXO
>>478
UTF-8は上位ビットを見れば文字の先頭か途中かまた何バイトなのか等がわかるので変換しなくても文字数はわかる(詳しくはWikipedia等を参照)。

そんな小技使って作られているかどうかはわからないが。
2020/01/31(金) 10:37:58.90ID:XoEdclD3
>>488
alias loop="while true; do"

loop echo aaa; done
2020/01/31(金) 10:41:13.70ID:XoEdclD3
alias IF=if
alias THEN=then
alias ENDIF=fi

IF [ a = a ]; THEN
 echo aaa
ENDIF
2020/01/31(金) 11:40:54.85ID:aEgzRTpo
>>490
一応変数使ってもいけね?

loop='while true; do'

eval "$loop echo aaa; sleep 0.1; done"

てかeval使えばなんでもありだから,
evalを使わずにって条件だと,挙げてくれた例みたいなことが
実現できるのかな。
2020/01/31(金) 11:42:09.27ID:XoEdclD3
× 一応変数使ってもいけね?
○ eval使ってもいけね?

だろ
2020/01/31(金) 11:42:25.98ID:XoEdclD3
そして、evalを使わないと実現できない
2020/01/31(金) 14:09:19.88ID:y3M2GGQ2
>>492
loop() { while true; do "$@"; done }
f() { echo aaa; sleep 0.1; }
loop f
2020/01/31(金) 15:35:28.23ID:aEgzRTpo
>>495
関数でもいけんじゃん
2020/01/31(金) 19:02:07.40ID:drX8qvaW
>>496
趣旨を理解してないなら黙ってて
2020/01/31(金) 19:33:30.56ID:dOfy+zuH
shebangにさ、#!/bin/sh -eu って書いたらちゃんと動くのに、
#!/bin/sh -e -u って書いたら動かない
オプションは一つしか受け付けない?
これってどこに仕様ありますか?
2020/01/31(金) 19:37:01.40ID:dOfy+zuH
一つしか受け付けないと言うか

#!/bin/sh -e -u
って書いたら

/bin/sh "-e -u"
って解釈されるのか
全体が一つの引数
2020/01/31(金) 20:39:38.35ID:NEnVm4zd
実はshebangの決まった仕様はないからOS依存
2020/01/31(金) 21:40:42.29ID:O7+QvGXX
>>500
仕様上はOS依存として、
実際にこれ以外の挙動をする場合ってあるの?
2020/01/31(金) 21:53:14.63ID:ppIZAX+V
>>488
\ でalias をキャンセルできる機能
関数とか変数では、例えば ls を定義したときに
簡単にキャンセルできない。alias なら

$ \ls

で一発O.K.
2020/01/31(金) 22:07:06.55ID:EhZkCGRB
この前会見したマスごみが感染元で
2020/01/31(金) 22:09:28.96ID:MHZeJgmL
>>502
command なら alias も function も OK

$ command ls
2020/01/31(金) 22:17:23.02ID:NEnVm4zd
>>501
a) 1つ目のスペースの前がコマンド名、その後はスペースも含めて1つの引数 (Linux等)
b) 1つ目のスペースの前がコマンド名、その後はスペース区切りの複数の引数 (昔のBSDやOSX等)
c) スペースも含めて全部コマンド名 (実在するか不明)
d) shebang非対応 (昔はあったがほぼ絶滅)

あとは、最大長とかにも注意
2020/01/31(金) 22:38:43.88ID:O7+QvGXX
macは違うのかよ。相変わらず独自文化だな。
2020/01/31(金) 23:54:24.78ID:9zbnwalP
>>505
#!の次は本来スペースだって知ってた?
508デフォルトの名無しさん
垢版 |
2020/02/01(土) 00:09:21.13ID:4wtj5811
>>478
Windows10, WSL, Ubuntu 18.04 では、
中国の「深圳」みたいな、サロゲートペアも、1文字になる!

echo -n '深圳' | wc -m
2
2020/02/01(土) 01:59:55.43ID:Kd/XXZch
>>507
https://www.in-ulm.de/~mascheck/various/shebang/#blankrequired
によるとその話が正しい証拠はない模様
2020/02/01(土) 02:50:01.41ID:SC0qANHR
>>507
逆にスペースを入れてはいけないというふうに教わったけど、
入れたからといって動かないというのはないな。
2020/02/01(土) 18:54:16.89ID:izL/3CDz
>>510
オライリーのシェルスクリプトの本には
一部のBSD系OSで#! の後にスペースが要るみたいなこと書いてあった。
でも、これは又聞きで全部試した訳じゃないけど
そんな挙動のBSD実装はなくて、
実はGNUプロジェクトのソースコードに誰かが勘違いして書き込んだコメントが元らしい。
2020/02/01(土) 19:00:18.82ID:S6J9WFvX
>>505
> b) 1つ目のスペースの前がコマンド名、その後はスペース区切りの複数の引数 (昔のBSDやOSX等)

macOSが今もこれなんだな。複数の実装があるのはめんどくさいな
2020/02/01(土) 19:16:51.31ID:rbhAio8f
>>512
ソースチラ見した限りでは元々は a) ぽい。# の後ろはコメントとして切り捨ててるみたいだが
FreeBSDをガシガシ取り入れた時にFreeBSDが b) だからに変えたぽいかな。その後FreeBSDが a) に変わったが追従せずな
2020/02/01(土) 19:25:08.01ID:rbhAio8f
>>513
># の後ろはコメントとして切り捨ててるみたいだが
元々はこれもなく、まんま a) 。その後に #の後ろ切り捨て。その後 b) だった
2020/02/01(土) 19:29:08.08ID:7bhnkH1k
macOSでshebangにダブルクォートが入っていた場合どうなるんだろうなぁ
すぐそこにマシンあるから調べればわかるけどさw
2020/02/01(土) 19:56:33.67ID:rbhAio8f
一番古い10.0から公開されてる最新の10.4までで、そこでダブルクォート文字は現れない、'\n'、'#'、' '、'\t' ぐらいしか文字としてナニかを判断してない
単なる文字だね。そのまま引数としての単なる文字として
2020/02/01(土) 20:38:02.21ID:7bhnkH1k
日本語が不自由だぞw
2020/02/01(土) 20:50:05.02ID:izL/3CDz
shebangは悪い文化
2020/02/01(土) 20:54:33.24ID:7bhnkH1k
shebangよりも拡張子の方が良かったのかな?
2020/02/01(土) 20:57:55.39ID:rbhAio8f
なんか説明しようとしたんだがな
ダブルクォートが入っていても関係ないよ。なぜかは調べてね
2020/02/01(土) 20:59:45.01ID:rbhAio8f
>>518
悪い文化というより、POSIXで規定しろというだけかな
悪い文化のががっつりカーネルで実装されてるんだけど
2020/02/01(土) 21:13:13.94ID:izL/3CDz
>>521
単なる表現だから気にしないでほしいけど
悪い←実装ごとに挙動がバラバラ・標準仕様が規定を諦めている
文化←にもかかわらずほとんどの実装がこれを取り入れていて、利用者もしょうがなく使っている
という状況を言ったつもりだった。
2020/02/01(土) 21:19:14.91ID:rbhAio8f
>>522
なるほど
まあ、誰も(大多数が)困ってないんじゃなのかな、統一されてなくても
もしくはそれぞれがそれぞれが良いと思って譲らないとかかwそれは確かに悪い文化だな
誰も困ってないって方だと思うけど
2020/02/01(土) 21:48:34.75ID:7bhnkH1k
shebangが悪い所の一つは絶対パス指定ってところなんだよね
content-typeみたいなのだったら良かったのに

shebangのオプションに関しては使わないっていうのが正解なんだと思う
なぜならファイルを直接指定して実行すると変わっちゃうから
2020/02/02(日) 14:26:51.03ID:xQhhTPSe
てかshebang使わなくてもシェルから起動したらそのまま動かない?

と思って、念の為Bashから起動したらまさかのaliasが効かなかった……。

こういうのを避ける為に#!/bin/shとせざる得ないのか。残念。
2020/02/02(日) 16:53:40.51ID:XLs1Cb+c
>>524
絶対パスかどうかは、シェルというか、インタープリタに依存するんじゃないの?
Pythonなんかだと、パスさえ通っていれば、#!python とか #!python3 で使い分けできるし。
2020/02/02(日) 17:45:00.84ID:Cva1xhgA
>>526
(少なくとも現在は)shebangを解釈しているのはOSであって、絶対パス必須
#!pythonと書いたスクリプトをexecveした場合、普通は動かない
2020/02/03(月) 06:12:52.05ID:UlsnX0ii
みんな
#!/bin/env python
じゃないの?
環境変数使ってくれるよ
2020/02/03(月) 08:04:03.85ID:24GdBe+7
envがあるところは/usr/bin/envな

あとそれ使うと

#!/usr/bin/env bash -e

とかできなくなるからな
Linuxで
2020/02/03(月) 09:05:47.42ID:gnFHl5C0
>>529
/bin/envの環境と/usr/bin/envの環境がある
531デフォルトの名無しさん
垢版 |
2020/02/03(月) 10:00:30.45ID:24GdBe+7
>>530
envってコマンドを使うと、環境の違いを吸収してくれるから便利だぞ
2020/02/03(月) 11:22:27.68ID:8ufJ91gq
>envがあるところは/usr/bin/env
に対しての
/bin/envにある環境もあるって話だろ。「それってなに?」だろ言うなら
2020/02/03(月) 11:28:54.24ID:sGoeeXwW
>>531
そのenvコマンドとやらのパスが環境ごとに違うんだよなぁ…。
2020/02/03(月) 11:40:34.98ID:8ufJ91gq
KCディフェンス覚醒したか?するか?
2020/02/03(月) 11:41:11.41ID:8ufJ91gq
やったな、KCディフェンスっ
2020/02/03(月) 11:41:39.96ID:YoBHNt10
Mac の香具師は、env をよく使う
2020/02/03(月) 11:41:40.96ID:8ufJ91gq
すまん、誤爆もいいとこ。ちょっと興奮してたw
2020/02/03(月) 11:57:54.57ID:MUEM5Vrv
env env env ...
2020/02/03(月) 12:09:00.93ID:sGoeeXwW
なんかこの前々スレあたりで標準出力と標準エラー出力に別々の処理を施した上で
どちらも標準出力に流す方法を見た覚えがあるんだけど
今それっぽい語句で検索しても引っ掛からない。

覚えてる人いない?
2020/02/03(月) 12:58:07.85ID:24GdBe+7
>>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
541417
垢版 |
2020/02/04(火) 21:40:22.30ID:M0ahQJ78
>>446
ありがとうございます。
コードを参考にさせていただいて、
sed -e 's/\("[^"]*"\)*,\("[^"]*"\)*/\1 \2/g'
という手法にしました。

今のところ
<<. cat |
aa,"dd,dd","aa,bb",cc,"ab c"
.
sed -e 's/\("[^"]*"\)*,\("[^"]*"\)*/\1 \2/g'
がうまいこといくので満足してます。
どうもお手数おかけしました。
2020/02/04(火) 22:00:02.89ID:zwthX76y
case $value in
 ここ)
esac

ここって何ていうの?globじゃないよね?
2020/02/04(火) 22:01:37.15ID:/eeo/zhy
bash(1) だと pattern って書いてある
2020/02/04(火) 22:11:53.72ID:zwthX76y
パターンかぁ。汎用的すぎるなぁ。
2020/02/05(水) 07:03:40.14ID:TkSDhbEE
(unofficial) Bash Strict Modeって知ってる?
http://redsymbol.net/articles/unofficial-bash-strict-mode/

これが何って話があるわけじゃないんだけど有名なのかな?と思って
外国だとそれなりに情報出てくるけど日本はあまり見つからない

名前が知られてないだけでsetで-eu -o pipefailしましょうというのは聞くけどね
ただIFS=$'\n\t'は知らなかったな。これやったほうがいいんかな?
スペースが削られてるから問題起きそうだけど
2020/02/05(水) 08:00:23.89ID:ER23be8Q
>>545
IFS=$'\n\t'
↑これはどういう事態を防げるの?
寧ろ
for file in *; do
echo $file
done
こういうのが動かんくなる気がするけど。
2020/02/05(水) 08:25:41.70ID:TkSDhbEE
>>546
それは変数使ってるわけじゃないから問題なく動くよ
2020/02/07(金) 21:49:29.34ID:fFz2F73L
https://github.com/bashup/mdsh
↑おもしろい。シェルも使える文芸的プログラミング
2020/02/07(金) 22:25:08.40ID:LLO+pCZY
めんどくさいので3行にまとめてくれ
2020/02/07(金) 22:46:56.58ID:LLO+pCZY
なるほど。文芸的プログラミングという
ドキュメントを書くときにコードを埋め込んで
(動作確認のために?)実行できるようにするための
マークアップ言語みたいなものがあるんだな
コードの中にコメントを埋め込むのとは逆の発想か
2020/02/07(金) 22:58:24.38ID:YkBBCjCg
bashのsourceって英語としては意味なんだろう?
includeとかimportだったら読み込むってわかるけど、
なんでsourceって単語にしたんだろうか
2020/02/08(土) 00:06:22.51ID:Ld8bPHII
なんのことかと思ったらMarkdown文書をソースとするshellがありますぞというだけかという感じ
2020/02/08(土) 08:03:47.73ID:EnngxFza
なんでそんなに偉そうなんだよw
2020/02/08(土) 12:05:42.11ID:vyHTTWz1
>>551
元々は設定ファイルを読み込む

$ source .bashrc

あたりで使っていたようなので、「基にする」あたりが
英語の意味かと思う
2020/02/08(土) 14:06:09.11ID:EnngxFza
今から考えるとimportコマンドとかの方がいいね。
2020/02/08(土) 14:51:42.04ID:0wE1WgKD
importは他のファイル等で定義済みの関数やクラスを今の名前空間に持ってくるイメージ
sourceは他のファイルに書いてるコードを実行するイメージ
言語によってはやってること同じだったりするけど主たる目的が違う気がする
2020/02/08(土) 15:15:58.57ID:rR7NyU2B
だな
2020/02/08(土) 15:41:05.52ID:WgESEu8I
> sourceは他のファイルに書いてるコードを実行するイメージ
動作としてはそうなんだけど、
気になってるのは英単語としてどうかなんだよね
変なことを気にしてると思うけど

そもそもsourceって動詞?ああ、動詞としての意味もあるのか?
https://talking-english.net/source/
> sourceは動詞でも使い方があり「仕入れる」といった意味になりますが、
>
> 例文
> We source our coffee beans from Venezuela.
> 私たちはコーヒー豆をベネズエラから仕入れている。
2020/02/08(土) 22:01:26.95ID:EnngxFza
importに名前空間を移動する印象があるのは同意だけど
sourceの「他のファイルに書いてるコードを実行する」ような印象はないな。
つーかsourceってシェル以外でみかけない。
名前空間とか高級な概念を無視する、単なる対象ファイルの実行・読み込みは
includeが一番「それっぽい」な。
C言語みたいなコンパイル方式でもm4・Xresourceみたいなインタプリタ・設定ファイル形式でも。
2020/02/08(土) 23:17:01.30ID:WgESEu8I
sourceの本来の名前が . だとして、
/etc/profileとかに . /etc/bash.bashrc とか書いてあるでしょ?

これは関数定義等を読み込んでると言うより、
ただそこにあるスクリプトを実行してるという感じがしない?
2020/02/08(土) 23:17:36.95ID:WgESEu8I
そもそもなんで . (ドット)だったのかっていう疑問もあるけどw
2020/02/09(日) 07:56:47.77ID:u8D56ofC
>>560
ああ、いや、たしかにそうなんだけど、
sourceっていう名前の(または.(ドット)って名前の)コマンドや指令が
シェルスクリプト以外で見掛けないなと思ってさ。
じゃあシェルスクリプト以外の言語でsourceに最も近いはたらきをするのは
なにかって言えば、includeかなぁ。と。
2020/02/09(日) 08:09:38.60ID:WtBEbY+3
includeで言えばC言語かなぁ
でもC言語のincludeはヘッダファイルの読み込みで
(今のC++はそうとは言えないが)
実行するものはなにもないものだったよね

.やsourceを他の言語で見たことがないのは同意
なんでこの単語を選んだのか。まあ当時はそういうことをするときの
標準的な単語はなく、includeやimportの方がたまたま有名になったってだけな気もするけど

includeってC/C++以外あったっけ?
2020/02/09(日) 08:12:52.16ID:WtBEbY+3
include, import, load, require, source
他に何があるかな?
2020/02/09(日) 08:15:45.81ID:WtBEbY+3
とういうか、その話をするためにきたんじゃなかったw

makeってどういう亜種があるの?
それぞれのOSでどこまで互換性があるの?
どこかにそういう情報まとまってないかな
2020/02/09(日) 08:19:42.30ID:WtBEbY+3
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html
ここにPOSIXに関しては書いてあるけど、現実としてはどこまで互換性があるのかなと
つまり便利ないろんな機能(?が使いたいけど、ここには書いて無いようで
使っていいものなのかわからない
2020/02/09(日) 08:26:03.00ID:WtBEbY+3
オライリーのGNU Make、無料で公開されてたヽ(=´▽`=)ノ
https://www.yokoweb.net/2016/08/28/gnu-make-3rd-pdf-github/
2020/02/09(日) 08:40:31.63ID:WtBEbY+3
Makeについて調べていたら上のシバンの話、!の後にスペース入れれっていうのが見つかったでw

https://web.sfc.wide.ad.jp/~sagawa/gnujdoc/autoconf-2.59/autoconf-ja_10.html
> また,以 下のように,インタプリタ仕様として,感嘆符の後にスペースを含めてください.
>
> #! /usr/bin/perl
2020/02/09(日) 08:41:08.32ID:WtBEbY+3
ここまでコピペするべきだった

> パスの前のスペースを省略する場合,(DYNIXのような)4.2BSDを基本 とするシステムは,
> `#! /'は4バイトのマジックナンバーとして解釈される ので,その行を無視します.
> 古いシステムでは,`#!'行の長さにも小さな 制限があり,例えばSunOS 4では,(改行を含めず)32バイトになります.
2020/02/09(日) 09:07:13.64ID:nPaz0f5T
>>563
VBScript
2020/02/09(日) 10:20:28.40ID:gml78nRc
>>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.33ID:mw6BsSoR
pgrepには検索文字数の制限があるのか?
2020/02/09(日) 12:29:59.77ID:3rHefPWY
そんなのあるのか? pgr
2020/02/09(日) 13:26:52.28ID:u8D56ofC
>>572
どこ情報?
575デフォルトの名無しさん
垢版 |
2020/02/09(日) 14:04:29.38ID:Fnglc4p2
>>563
あなたはC言語がUNIXを作るために作られた言語だと知らないの?
576デフォルトの名無しさん
垢版 |
2020/02/09(日) 14:07:08.39ID:Fnglc4p2
>>569
そもそもどのUNIX、Linuxの話をしているのか?
2020/02/09(日) 14:20:04.33ID:QqkdphAP
>>575
それがどう話につながるのか説明してくれ
2020/02/09(日) 14:57:41.05ID:RDxzsaY4
shellはUNIX上でのいちプログラム、UNIXはCで作られてる。shellだってCで(途中から?)作られていただろう。故に、
>当時はそういうことをするときの標準的な単語はなく、includeやimportの方がたまたま有名になった
ということはなく、同じならinclude使うんじゃねってとこかな?なんか違うから違うのにしたという方が読みやすいかなあ

shell scriptはPrologの構文が元じゃなかったっけ。ちょっとググったとこでは、
:-
か。なんかこれに似てるといえば似てるな . は
579デフォルトの名無しさん
垢版 |
2020/02/09(日) 15:11:26.44ID:Fnglc4p2
>>577
先に存在しているC言語とは別の考えで設計されている。カリフォルニア大学のバークレー校の複数人が考えたものだから、統一感がないのは仕方ない。
2020/02/09(日) 15:48:09.09ID:mPwdKOvO
>>572
linuxならlinux自体にプロセス名の長さ制限(16文字)があるからそうなる
コマンドライン自体はlinuxも十分長い文字列を扱えるから、-fを使えばよい
2020/02/09(日) 16:48:41.40ID:RDxzsaY4
>>578
>shell scriptはPrologの構文が元じゃなかったっけ
違った。ALGOLだな。ALGOLでそれっぽいのはUSINGみたいだが、ちょっと違うなあ
2020/02/09(日) 16:50:22.96ID:u8D56ofC
for a in XXX; do
somecmd...
done
↑ここのXXXの大きさについて、SUSやらで文書化された制限ってある?
もしあるとすればどう調べればいいかな。

XXXは引数じゃないからARG_MAXとかじゃないし、
もしかしたら実質無制限?(システムのメモリに依存とか?)
583デフォルトの名無しさん
垢版 |
2020/02/09(日) 19:33:12.64ID:wmQivLfL
ksh 2020がでたのは知ってるけどkshに一体何が起きてるんです?
20年以上の開発がゴミクズとして消えるんですか?

Rewinding this repo and encouraging community
https://github.com/att/ast/issues/1466
2020/02/10(月) 00:06:22.74ID:jvWR6fCp
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.
2020/02/10(月) 00:08:02.47ID:jvWR6fCp
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を去りました。社内にはまだ多くのユーザーがいますが、
プロジェクトを維持および管理できるユーザーはいません。
2020/02/10(月) 00:11:44.63ID:jvWR6fCp
私の提案は:

・ 現在のマスターをブランチ「ksh2020」(または適切なもの)に移動します。
・そのブランチのREADME.mdおよびCHANGELOG.mdをメンテナンスされていないものとして
明確にマークします。#1464をポイントし、詳細についてはこの問題を参照してください。
・ マスターブランチを2012-08-01-masterにリセットします
・リポジトリから外部の共同編集者を削除します。AT&Tの誰もこれを維持していないので、
このフォークをアクティブなものにすることは意味がありません。GitとGithubを使用すると、
誰でも自分のスペースで好きな方向にコードを取得できます。
2020/02/10(月) 00:12:00.37ID:jvWR6fCp
・ README.mdをクリーンアップして、現在の状態を反映します。「このレポには、ASTの
AT&T ksh93u +および試験的なksh93v-バージョンが含まれます。ASTおよびkshのフォークは
後である可能性があります。」
・ CONTRIBUTING.mdを変更し、テンプレートを明確にして、このフォークを
積極的に維持しておらず、何も確認しないことを約束します。
・リポジトリの説明を「AST-AT&T Software Technology」に短縮します(#1441)

これが完了したら、AT&Tでmasterブランチのksh93u +にパッチを提供する可能性があります。
些細なこと(ビルドの問題など)でない限り、貢献を確認したり受け入れたりすることはおそらくないでしょう。
最終的には、このリポジトリをアーカイブします。

現在、会社の誰もがkshのためだけにレポを作成するつもりはないと思います。
しかし、これはかなり簡単で、コミュニティが取り上げることができると思います。
2020/02/10(月) 00:27:01.24ID:jvWR6fCp
こういうこと?

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ブランチにはもうメンテナンスしてないって書いてあるからそれ消してから勝手に続きをやれ
2020/02/10(月) 08:02:14.12ID:RPv+4ALj
Google翻訳使うなとは言わないけど,わざわざそれをスレに載せるな。
せめて自分で訳したものならともかく,なんの情報でもない。
2020/02/10(月) 08:09:49.99ID:jvWR6fCp
え?翻訳すらしないでコピペすることだってあるじゃん
そういうのを引用っていうんだよ。
引用したらだめってこと?意味がわからないなぁ
2020/02/10(月) 11:18:22.31ID:RPv+4ALj
>>590
飛躍しすぎ。
スレと関係ないただの忠告になるからこれ以上言わんが、
引用するななんて一言も言ってないし,ただの引用のほうがよほどマシ。
ていうかGoogle翻訳したものを貼り付けて「引用」って……

あなたはGoogle翻訳(機械翻訳全般)を信じてるのかも知れないけれども,
2020年現在,これらの翻訳の質は,あなたが貼り付けた文章を見ても分かる通り,酷いもの。
半分「嘘っぱち」の文章が出てると言っても過言じゃない。
特に,機械翻訳の中でも,minhonやlibtr8nとは違って,Google翻訳は2018年ころから
「学習した英語・日本語訳文からそれっぽい文字の並びを引っ張ってくる」っていう手法を取るようになったから
「見てくれは他の機械翻訳より自然≠セけど内容が全くデタラメ」っていう最悪の事態を生み出すようになってしまった。
幸か不幸か,あなたが貼り付けた文章にそこまで酷い誤謬はないけど,上述の翻訳手法である以上,
Google翻訳した文書を貼り付けるのは,原文を貼り付けるより酷いばかりか,
何も情報を提供せずに各自がリンク先なんかで情報を確認するよう要求するほうがよほどマシなくらい。

あなたは悪気なくGoogle翻訳を使って,スレに貢献しようとしたのかもしれない。
リンク先の文書の内重要と思われる部分をスレ本体に引用することは悪いことじゃないけれど,
そこでGoogle翻訳を使ってしまうのは,ちょっとキツい言い方になるけど「嘘を教える」ことに繋がってきてしまう。

もしこれからリンク先の文章を引用する機会があれば,原文を貼り付けるか,下手でもいいから自分で翻訳してみてね。
2020/02/10(月) 11:56:29.56ID:jvWR6fCp
>>591
はは、的外れすぎてワロタw
英語をそのまま貼ってもリンク先読まない人が多いから
単に変換しただけ。英語というだけでスルーする
日本語ならぱっと見でわかる。内容が気になったのならリンク先読みなさい。
読んだのなら貼り付けた意味があったということ
2020/02/10(月) 19:24:20.30ID:SWS6qR4K
宮城県に住んでるだったかの誰かにそっくりだな
2020/02/10(月) 19:51:47.28ID:RPv+4ALj
>>593
もう放っておこうぜ。

俺なりにかなり丁寧に説明したんだけど,
どうも何について文句を言われてるかすら分かっていないようだから。
2020/02/10(月) 21:25:40.41ID:MJVq5TQy
>>591
こういう輩は長文を読む力がないのだから、こういえばいいんだよ
「日本語でおk」
2020/02/10(月) 21:40:51.77ID:4n8TqQDg
擁護賛同してるのか?あそこの初っ端は間違っているけどな
直してやれよ
2020/02/12(水) 17:16:49.73ID:SPYER+lN
コマンドの速度を測りたいときに出力を/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

これを防ぐために「端末上に書き出してるのと同じくらいの負荷が書かるけど、実際には端末上に出力されない」
みたいな状況を作りたい。
おしえてください。
2020/02/12(水) 17:58:00.53ID:44kLfG7j
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
2020/02/12(水) 21:18:18.55ID:ngmZ90wk
>>597
画面に出力されてる時間のせいだから無理じゃね?
/dev/ttyにだせば端末上に出力されてるけど標準出力に影響はない
あとは出した上でエスケープシーケンスで消すとか
600597
垢版 |
2020/02/13(木) 19:02:20.33ID:qpgEIAWv
>>598
うーん。ちょっと偉そうな注文だけど
システム全体の設定を変更したり、
かつroot権限が必要なのはちょっと…

>>599
エスケープシーケンスは思い付かなかった。
でも出力の中に一つでも文字属性を元に戻すようなものが
含まれたりするとマズいよね(いやまあ,それに目を瞑ればいいだけの話なんだけど)…

どうも一般的な方法では無理そうなので,
ダラダラ出力させることにします。
困ることといえば端末のスクロール履歴が消えるくらいだし。
601デフォルトの名無しさん
垢版 |
2020/02/13(木) 19:45:08.54ID:d+A9Zjku
標準出力バッファを無効にして/dev/nullに送り込むと良いかも。知らんけど
2020/02/15(土) 07:57:33.28ID:TqNhf8oX
ていうかtimeで測った絶対速度なんてほとんど信用できなくて、(ハードウェアの状態なんかに依存するから)
使い道としては複数のコマンドどうしの相対速度の比較が主でしょう。
ならば、両方とも> /dev/nullに捨てておけば、相対速度としては変化しないから速度比較の目的は果たせるのでは。
2020/02/15(土) 09:41:54.81ID:LBGCL7FY
リダイレクトとfdは概ね理解したけど3以上はどう使えばいいんです?
1>や2>は自然と使い分けてるけど1>&3を使う機会なくて
&>の方がまだ出番ある
2020/02/15(土) 11:02:57.91ID:vIJrSTGq
>>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
2020/02/15(土) 13:14:38.75ID:QAGa8Flq
bashの問題なのか知らんけど、
CRとかLFとかTABとかVTとかをどう解釈するかって
制御するフラグってあったりする?OSがらみの設定でもいいけど
606デフォルトの名無しさん
垢版 |
2020/02/15(土) 14:59:47.10ID:7hJxIdg7
>>605
sttyコマンドとか?
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/stty.html
2020/02/15(土) 17:24:25.12ID:LBGCL7FY
>>604
foo.logには標準出力とエラーが両方保存される
>&3がある行だけが画面に出力される
よく出来てますわ
ログ取りに使えるのか
2020/02/15(土) 22:02:17.95ID:7TGox9oB
>>606
sttyコマンドなのかな?

詳細は言えないけど、"予め構築された特定の環境"のみおかしくなる
(どうやって構築されたかは公開されてない)
それと近いと思われる環境を自分で作っても再現できなくて困っている。

evalやコマンド置換と改行やタブ含めたホワイトスペースに属する文字を
使ったときにおかしくなってるのはわかるんだが
どうやったらこんな状況を作れるんだろうか。なぞだ。
2020/02/15(土) 23:22:52.25ID:FhP/kA+H
頭悪い奴ってのは、おかしくなったとかエラーになったとかいうだけで、
どうなったのかメッセージはなんなのか、そこを書かないのは何でだぜ
おかしいのはシステムじゃなくておまえの頭だろうという
2020/02/15(土) 23:28:09.90ID:7TGox9oB
evalするときに何故か構文エラーが起きたり
ホワイトスペースがどこかで消えたりしている。
2020/02/15(土) 23:28:21.51ID:2teiXV5j
>詳細は言えないけど
なんだろ。単なるチラ裏なことを長々とというだけの
対処する側なのにその前置きでエスパー求めるなんてありえないし
2020/02/15(土) 23:28:41.71ID:7TGox9oB
もちろんその環境以外ではそんな事は起きていない。
だから制御する方法があるのだろうと思ってるがわからない。
2020/02/15(土) 23:31:04.26ID:2teiXV5j
>>610
何かを求めたいなら具体的に書こうな。Terminalでのまんまとか
そのままじゃ何か問題があるなら、似たようなのに加工できるだろう
2020/02/15(土) 23:31:40.17ID:7TGox9oB
>>613
具体的に書くとまずいことがあるからわざとぼやかしてる
2020/02/15(土) 23:32:15.43ID:2teiXV5j
だったら、チラ裏なげえな
2020/02/15(土) 23:33:17.78ID:7TGox9oB
短くしたら、お前が俺にレスさせるようにしただけ。
最初に詳細は言えないって書いてるんだから察しろ
2020/02/15(土) 23:36:08.92ID:2teiXV5j
そうちゃんと読みとって>>611と書いているんだが。すでに
何かをまだ期待してちょっとだけな>>610をとか続けるようだからなんだがな
これ以上もうないだろけど
2020/02/15(土) 23:38:36.70ID:7TGox9oB
俺が>>610と続けた後に
お前が>>611を書いたんだろ

時系列ぐらい把握しろやw
2020/02/15(土) 23:40:02.90ID:2teiXV5j
残念ながら、>>611>>610なんてなかった時に書いたのだよ
お前は本当に自分視点しかなさすぎだぞw
2020/02/15(土) 23:50:22.01ID:7TGox9oB
>>619

>>610>>609へのレスだって気づいているか?
また書いていなかったとか言わないよなw

続けたのは俺じゃない。俺は最初から詳細は言えないと書いている。
2020/02/15(土) 23:52:28.65ID:cPtDrAlk
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\
2020/02/15(土) 23:53:21.82ID:2teiXV5j
何を言っているのかなあ。意味不明すぎ
読めなさすぎだろう、独りよがりすぎだろう
2020/02/15(土) 23:57:25.05ID:7TGox9oB
理解能力がないという告白を見た瞬間w
2020/02/16(日) 00:03:10.55ID:0ownCpNF
>>609をみて、「頭悪いやつ〜おかしいのは〜お前の頭だろう」というのは言い過ぎだろう、わからないでもないけどw
てか「詳細は言えないけど」てあるやん、まあ、そういうことだろう。チラ裏だけどなw
ということで、611を書いた

そしたら、直前同時に610があった(それが609に反応してのなんて当たり前だろう。逆になんでそうじゃないと思うのか意味不明すぎ)
なんだかな、またふわっとしたことを。なので、613を書いた(アンカー付けるてるのはそゆことだよ)
そしたらならなんか616があったりしたが、まあ前後してたんだよ。そんなの当たり前にあるだろうに

>>623
お前は本当に自分視点しかなさすぎだぞ、マジでw
2020/02/16(日) 00:06:52.88ID:0ownCpNF
誤 そしたらならなんか616があったりしたが
正 そしたらならなんか612があったりしたが
626デフォルトの名無しさん
垢版 |
2020/02/16(日) 09:10:15.42ID:xg4O4sK0
sort -kについて正しく分かり易いサイトはないですか?
2020/02/16(日) 12:16:49.32ID:O89bDljg
>>626
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html
2020/02/16(日) 12:17:20.39ID:k2/UeE1A
えいごなのでわかりやすくないです
2020/02/16(日) 12:50:45.03ID:tUbalZD+
https://github.com/coreutils/coreutils/blob/master/src/sort.c
2020/02/16(日) 13:15:28.05ID:U5VJnWmt
>>627
中国語の解説をご所望だそうだ
2020/02/16(日) 14:38:33.35ID:O89bDljg
おめーらイジワルだなw
2020/02/16(日) 15:33:45.11ID:iNVxJNOu
分かりやすい
http://tldp.org/LDP/GNU-Linux-Tools-Summary/html/x6993.htm
2020/02/17(月) 08:01:59.15ID:ZjAffcZp
与えられた数字のファイルの行番号になにかを書き込むスクリプトってどう書くのが一番いいですかね。
一応 今 思い付いてるのは
与数をNNN,書き込む文字列をXXXとして
sed -n -e 'NNNs/.*/XXX/p'
↑こういうのかなと思ったんだけど
これだと新規ファイルを作成する目的には使えない…
2020/02/17(月) 10:14:55.01ID:LO6gJc6j
nl使えばいいだろ。POSIX標準の基本コマンド一覧見ろや
2020/02/17(月) 10:37:47.88ID:ZjAffcZp
>>634
nlにそんな機能あるの?
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/nl.html
↑ここ見る限り
指定した行になにかを書き込むなんていう機能なさそうなんだけど。
2020/02/17(月) 10:47:12.51ID:8g99SQEJ
こういう事?

seq 10 | sed '5s/.*/& Here/'
2020/02/17(月) 11:12:00.77ID:ZjAffcZp
>>636
そうそう、そんな感じ。
行番号自体は出力に要らないけどね。
ただ、それだと >>633 でも言った通り、
元のファイルがない状態から生成できないんだよ。

示してくれたスクリプトでも「10行出力する」
っていう前提があって始めて機能するよね。
やりたいのは全部で何行必要か分からない状態で
次々に指定した行に文字列を書き込むってこと。
638デフォルトの名無しさん
垢版 |
2020/02/17(月) 14:40:41.78ID:xPbhxlpI
配列に書いて要素番号と共に出力すれば
2020/02/17(月) 14:53:39.21ID:qj5C8HtX
おまえらよく

与えられた数字のファイルの行番号になにかを書き込むスクリプト
で何がいいたいのかわかるな

与えられた 数字のファイル の行番号なのか
与えられた数字 のファイルの行番号なのか
与えられた数字のファイル の行番号なのか
与えられた数字のファイルの行番号 なのか
さっぱりなんだがw

入力と出力の例を出せば、すぐに解決する問題だろうに
2020/02/17(月) 14:56:06.69ID:qj5C8HtX
> やりたいのは全部で何行必要か分からない状態で
> 次々に指定した行に文字列を書き込むってこと。
これもさっぱり

何行必要かわからないって、何の行数なのか
次々に指定した行って、どうやって指定するつもりなのか

示したスクリプトは別に10行という前提じゃなくても機能するし
元のファイルがないって、元のファイルってどのファイルだよ?
なければ作ればいいだけだろ?
2020/02/17(月) 15:06:30.32ID:y136Nw0W
行ごとに何か処理したいならawkの出番なのでは?
2020/02/17(月) 15:42:52.76ID:ZjAffcZp
>>639
入力
linenumber=78
value='hoge huga'
linenumber=805
value='foo bar'
...

出力
(空行)...
(78行目)hoge huga
(空行)...
(80行目)foo bar

こんな感じっすね。
入力は(この例では)変数に格納するような形式にしましたが
別にこれと決まった訳じゃないです。
2020/02/17(月) 15:45:24.56ID:ZjAffcZp
>>641
うーん。それはまあ,sedでもawkでも同じことが言えますけど
どちらも既存のファイル(またはパイプ越しの既存の出力)に対しての行処理
が得意なんですよね。

一方いまやりたいことはファイルの新規作成であって
しかも最後まで行の総数が分からないという……

これはawkでどうにかするのは難しいのではと思います。
2020/02/17(月) 15:49:37.43ID:qj5C8HtX
行番号と文字列のペアが入ったデータ(ファイル)があって、
それに従って別のファイルの指定された行の頭に文字列を入れるってことね

ん?別のファイルの行の頭に文字列を入れるのか?
それとも単に、その出力通りに出すだけなのか?
その出力を作るだけなら簡単だろうけど・・・あーいやどちらも大差ないかw
2020/02/17(月) 15:50:05.60ID:P9Oy3OK5
先に行指定の最大値を取得すればええやろ?
2020/02/17(月) 15:54:20.48ID:y136Nw0W
それならもう無理せずperl,ruby,pythonあたりで書いたらいいんでないの?
2020/02/17(月) 16:01:09.81ID:qj5C8HtX
入力ファイル形式を
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' "$@"とか使えば短くできるだろうな。
2020/02/17(月) 16:15:26.16ID:qj5C8HtX
>>646
ロジックはどの言語でも変わらないので
シェルスクリプトでそれを書けばいいだけ
2020/02/17(月) 16:25:32.91ID:qj5C8HtX
短くしてみた。バグとかはしらん

i=1 num=0
while [ "$i" -le "$num" ] || read -r num string; do
[ "$i" -eq "$num" ] && echo "$string" || echo " "
i=$((i+1))
done
2020/02/17(月) 16:31:22.20ID:2IQo7lRr
>>637
どういうことをしたいのかよくわからんが、とりあえずtouchしておけばファイルは作れるんでないの?
2020/02/17(月) 18:55:51.30ID:P9Oy3OK5
一旦配列に入れてから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
2020/02/17(月) 21:12:48.06ID:ZjAffcZp
>>650
いや,ただたんに新規作成したい訳じゃない…
2020/02/18(火) 03:26:33.92ID:enVFBik2
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

次へ続く
654653
垢版 |
2020/02/18(火) 03:27:41.15ID:enVFBik2
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
2020/02/18(火) 03:35:49.66ID:dYxIHNEw
>>649
これが一番だな。短くてbash依存なし。ruby依存なしw
2020/02/18(火) 09:24:28.92ID:2AC9Ct1n
いや、それちょっとした文字列操作したくなった時点で相当めんどくさくなるだろ。。
てきとーなスクリプト言語使う方が正解だわ。
シェルで書くことに意固地になってるだけだろ。
2020/02/18(火) 09:30:40.26ID:HqsHcaRa
別にならんだろ。まああれだ、シェル芸しかできなくて
シェルプログラミングできないやつが
ごまかすために言ってるんだろうなと
2020/02/18(火) 09:53:00.13ID:2AC9Ct1n
あ、普通に馬鹿なんだな。。
もしかしてユニケージの人か?
2020/02/18(火) 10:03:42.59ID:HqsHcaRa
ユニケージを見ればわかるが、あれは使い物にならない
特定業務専用のコマンド集でしか無い
そんなことよりさ、自分でコード書けないの?
2020/02/18(火) 10:04:48.16ID:HqsHcaRa
文字列操作の何が面倒なのか知らんが、文字列操作はC言語よりもずっと楽なんだがね。
コマンド呼び出しだけを見れば他のどの言語よりも優れてるし
2020/02/18(火) 10:42:09.68ID:X2bVDQHa
> てきとーなスクリプト言語
シェルスクリプトとか?w
2020/02/18(火) 14:37:02.43ID:gCN/+gaX
>>660
ていうか実はシェルスクリプトって
PythonでいうC API的なものの嚆矢であり最前線なんだよね。
C言語の標準入出力・ファイル読出/書込をシェルでやって
数値計算とかバイナリ解析とかそういう部分はC言語でコマンド作って任せるっていう。
2020/02/18(火) 15:45:01.04ID:fdBjlYYo
IT系の仕事してるけどアプリ作ってるときはコンパイルは普通だった
でもインフラの仕事をするとシェルスクリプト多数だった
シェルスクリプト作ってる人たちはコンパイルの概念が分からないらしかった
プログラムはビルドしてリリースしてとソースと実行ファイルの管理が面倒だけど
シェルスクリプトって即物的なのがいい
2020/02/18(火) 17:27:39.45ID:X8dqmLc9
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の置換対象に数字を入れた場合は上手くいきました
2020/02/18(火) 17:30:18.44ID:hjlsDnk2
1 と 2 の間にあるのがスペースなんじゃ…
2020/02/18(火) 20:22:18.38ID:wp4bvOJX
>>664
sed のダブルクォーテーションをシングルクォーテーションにするとどう?
もしくは s/\t/... じゃなくて s/\\t/... とか

>>665
tr の場合うまくいく理由の説明ができないんじゃ?
667デフォルトの名無しさん
垢版 |
2020/02/18(火) 20:27:51.93ID:VB0SzzBs
>>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 非対応なんてことはさすがに無いと思うけど
2020/02/18(火) 20:33:06.70ID:hjlsDnk2
tr " \t" "," となっていてスペースが含まれているから
上手くいっているんじゃないかと
2020/02/18(火) 21:52:28.55ID:8C0JMYsF
665~668の方まで皆さんありがとうございます
とりあえず痴漢の成功例を○、上手くいかなかったのを×として
× tr " " ","
○ tr "\t" ","
× sed "s/\t/,/g" (\tを\\tに変える、クオーテーションを変えるなどしても同様)
○ sed "s/$(printf '\t')/,/g"
という感じでした。
macとlinuxでオプション違うのは経験で知ってたんですが正規表現にまで
関わってくるんですね…良い事を教えていただいてありがとうございます。
2020/02/18(火) 22:18:45.81ID:ObTpNy6/
macならgnu-sedをインストールしてそっち使ったほうが良い
2020/02/19(水) 11:18:51.97ID:nP6c4IYT
痴漢の成功例っていやだなw
2020/02/19(水) 12:03:18.50ID:pMNWrift
気が付かなかったww
2020/02/21(金) 06:21:58.42ID:A/822pua
$ ed -s <(seq 3) <<< $'3m1\n,p'
1
3
2
$ ed -s <(seq 3) <<< '3m1\n,p'
?

これでコマンドラインからedが使えるけどこの$ってどんな効果が?
付けないとこの通り表示されないし
2020/02/21(金) 07:58:16.90ID:0dzJ+7kH
>>673
Bashの機能でエスケープシーケンスを解釈する
'\n'だと\nに展開されるだけだけど
$'\n'だと改行に展開される。
あと$'\u30A2'みたいにUnicode番号も指定できる。
2020/02/21(金) 14:48:04.29ID:A/822pua
>>674
そういやシングルクォートなのに改行できてるな
$ echo $'foo\nbar'も改行されるし中々便利そうだ
ありがとう
2020/02/22(土) 16:39:03.63ID:C/dFKPoq
kshのリポジトリのmasterが3400ぐらいあったコミットが13に減っていてワロタw
2020/02/25(火) 12:18:34.54ID:S19Y4jrS
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オプションに対する引数を全部認識するようにしたい。

そういう処理をしているスクリプトのソースへのリンクとか教えてもらえるとすごく助かる。
2020/02/25(火) 12:53:16.03ID:5KSIeSvf
出現するたびになにかやればいいだけじゃん
2020/02/25(火) 14:13:23.37ID:oSeHo6cg
>>677
一般的かどうか知らないけど配列に入れて要素の数だけループさせてる
別のコマンドに渡すことが大半なのでループ内ではコマンド文字列を生成して実行はループの外でやる

while getopts “e:” opt; do
case "$opt" in
“e”) strings+=("$OPTARG");;
esac
done
shift $(($OPTIND - 1))

for value in "${strings[@]}"; do

done
2020/02/25(火) 15:00:07.73ID:mMwfySZI
bash依存は甘え
2020/02/25(火) 15:30:00.20ID:K+FIgRaj
>>679
ありがとう!
配列が使えるシェルならそれが一番いい方法かな。
2020/02/25(火) 15:45:41.88ID:K+FIgRaj
今更だけど、試しにNetBSDのgrepのソースコードを覗いてみたら、pattern[]配列に格納してたわ。
POSIXシェルみたいな配列に対応してないシェルでも0x1Fユニット区切り文字とか使えばいいかな。
2020/02/25(火) 17:02:15.34ID:eOOTHTW4
全てのシェルに配列はあるだろ? $@を使えばいいんだよ
あとはqiitaででも探せ。答えはそこにある。
2020/02/25(火) 17:24:31.11ID:S19Y4jrS
>>683
コマンドライン引数の処理において
$@を使ってもいいのかな。
普通に上書きしちゃいそうな気がするが。
2020/02/25(火) 17:25:41.11ID:S19Y4jrS
サブシェルで処理すれば$@は引き継がれないから影響ないけど
そうすると今度は肝心要の、現在処理しているコマンドライン引数を全く参照できなくなる。
2020/02/25(火) 17:46:16.45ID:eOOTHTW4
サブシェルなんかいらねーだろ
関数使えよ
2020/02/25(火) 22:33:40.09ID:S19Y4jrS
>>686

頭悪くて恥ずかしい限りだが、
スクリプトの例を書いてもらえないか。

excmd -a XXX -a YYY -a ZZZ
みたいなコマンドライン引数を解釈して、
全部読み切った後に-aオプションに対するオプション引数をそれぞれ取得できるっていう。
全部読み切った後ってのは、getoptやらで最後のオプションまで読み切って、
引数関連のエラーがないことを確かめてからってことね。
「-aオプションの出現を感知するたびに標準出力に出す」みたいなのじゃなく。
2020/02/25(火) 22:48:26.39ID:8Uixj76j
>>687
ヒント
2番目と4番目と6番目を取り出せばいいだけ
2020/02/26(水) 08:09:52.20ID:vrfGqddo
>>688

-aの位置の次にある引数を取得するってこと?
でもそうすると
-bcaXXX
↑こういうときはどう解析するの?(-b,-cは引数を取らないオプション)
この形式のオプションもPOSIXでは許可されてるから
当然解析できなければならないけど。
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html
2020/02/26(水) 08:25:40.38ID:iwwM4ZEx
>>689
引数処理にこだわり始めるとスクリプト実行して引数解析終わるまで時間がかかるようになって
使い物にならなくなるので複雑な記法は全部捨てたわ
POSIXで許可されているから実装しなきゃならないというならPOSIXを窓から投げ捨てるべき
2020/02/26(水) 08:29:52.36ID:kXv4PxDr
>>690
下手すぎw どうせgrepとかsedとか外部コマンド持ち出してやったからだろ
だから外部コマンドなし縛りをするんだよ

>>689
話が変わってる。POSIX対応したいならgetoptsとかでは無理
qiitaに対応してるサンプルコードがあるから探せ
2020/02/26(水) 09:28:16.44ID:9H3dDcdo
bash によるオプション解析 - Qiita
https://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb
getoptsの存在すら知らずに横着して=~を使ってすまんな
オプションの集約ってこうも面倒だったのね
693デフォルトの名無しさん
垢版 |
2020/02/26(水) 09:48:23.19ID:re2OdmIW
timeoutで終了するプログラムの最後の1行だけを表示させたいどうするの?
2020/02/26(水) 09:54:37.39ID:kXv4PxDr
>>692
どの言語にもオプション解析用のライブラリがある理由が分かったろ?
2020/02/26(水) 11:26:08.87ID:vrfGqddo
ちなみにgetoptsコマンドはPOSIXで定義されてるけど,実はPOSIXが定めるオプション書式に対応していないっていう。
まあOpenGroup側も「任意のオプション引数は歴史的な理由以外で使ってはならない」って言ってる訳だし
仕方無い部分もあるけど。
一方で複数回登場する引数付きオプションは,ちゃんと現行のアプリケーションでの使用も許可されているにもかかわらず
getopts自身はそういうオプションに対する便利な機能をなんら提供してない。
2020/02/26(水) 13:10:48.18ID:iFRpldfA
>>695
任意のオプション引数ってどういうもののことを言ってる?
2020/02/26(水) 13:41:46.61ID:vrfGqddo
>>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
↑こういう感じ。
2020/02/26(水) 13:46:00.81ID:Z7ha8duC
>>697
ああ、OKOK、ちゃんと分かってるね
2020/02/26(水) 15:55:24.01ID:vrfGqddo
>>698
分かってもらえたみたいでよかった。
2020/02/26(水) 23:24:46.41ID:iwwM4ZEx
>>691
使い物にならんから外部コマンドなし縛りにして、その結果複雑な書き方捨てたって事なんですが...

個人的には -help が --help の書き間違いとして拾ってくれずに -h -e -l -p になるのが気に食わんのですよ
701デフォルトの名無しさん
垢版 |
2020/02/27(木) 00:12:01.62ID:nCyLO+2A
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", "あ"] }
2020/02/27(木) 01:10:41.62ID:WuLbJO/f
>>700
その一文字オプションの連結に対応しなければいいだけじゃん
2020/02/27(木) 10:15:09.64ID:1d0gnp8c
>>702
>>700じゃないけど
彼は実装者としての立場ではなくて
利用者としての立場からの意見では?
つまりオプションパーサーを作ってるんじゃなくて
既存のオプションパーサーが-help記法に対応してないってこと。
704700
垢版 |
2020/02/28(金) 00:12:31.43ID:sbmuwMBZ
>>702
はい。 その通りで連結は未対応なスクリプト書いています。
後は値が連結しているタイプ (--foo=goo) も未対応にしています。
705703
垢版 |
2020/02/28(金) 17:35:34.53ID:+yZJUcOk
>>704
やっぱりね
2020/02/28(金) 21:07:42.16ID:11SJpN8G
> 個人的には -help が --help の書き間違いとして拾ってくれずに
-help が --help の書き間違いとして拾ってくれるものなんてある?
2020/02/28(金) 21:16:46.81ID:9ZnEM/be
>>700
> 使い物にならんから外部コマンドなし縛りにして、その結果複雑な書き方捨てたって事なんですが...

外部コマンドを使うと遅くなって使い物にならないから、
外部コマンドなし縛りで自分でパーサーを実装すればいいだけ。
それができないから「下手すぎw」と言ってるわけです。
まあ自分で作れないなら仕方ないけどw
2020/02/29(土) 08:02:48.75ID:A8pIm3Di
うわぁー
2020/02/29(土) 08:10:25.23ID:wnu08hYu
外部コマンドを使おうが使うまいが、パーサーのアルゴリズムに大差ないだろ?
今まで外部コマンドを使ってパースしてたなら、
それを外部コマンドを使わずにパースするだけじゃん
何が難しいというのか?
710700
垢版 |
2020/02/29(土) 09:04:49.63ID:toFJGN/1
>>706
普通ないんだが、注意力が無い何かなのか、問い合わせしてくるユーザーもいて
対応に苦慮することになるんだわ

>>707,709
引数を前から順番に処理してくれない getopt を使わないと決めた途端に難しくなったんだわ
getopt 使わずに -zxf (ファイル名) を -z -x -f (ファイル名) に分割簡単にできる?
-zfx (ファイル名) にしたときエラー処理/クレーマー処理できる?
2020/02/29(土) 09:27:10.60ID:Z90YN+Q9
>>710
問い合わせくるユーザーが居るだけで対応する必要ないじゃん

> 分割簡単にできる?
俺はできるw
2020/02/29(土) 13:13:04.89ID:IP0SEm6N
なんか、車輪の再発明みたいなことになってるなw
2020/02/29(土) 14:05:54.81ID:MM7sekhX
getoptが使い物にならないんだから
作らないとしょうがない
2020/03/01(日) 11:37:30.39ID:4tQoD8Fw
× getopt
○ getopts
2020/03/01(日) 12:51:34.60ID:4c8klxdl
シェルスクリプト用のオプションパーサーって無いの?getopt/getopts以外で
2020/03/01(日) 12:56:04.13ID:4tQoD8Fw
>>715
https://github.com/docopt/docopts
2020/03/01(日) 13:09:15.84ID:4c8klxdl
>>716
それはgo製じゃん
2020/03/01(日) 13:11:39.38ID:TiMroEot
> docopts : the command line wrapper for bash.
2020/03/01(日) 13:16:40.87ID:4c8klxdl
bashってのもマイナス点だな
2020/03/01(日) 14:02:23.94ID:4tQoD8Fw
>>717
シェルスクリプト用のあれこれはすべてシェルスクリプト製じゃないといけない
なんて思ってないよな?

俺の知っているシェル・OS環境は,
sortやgrepみたいな外部コマンドどころか for文や変数処理みたいなシェルの内部動作も
みんなC言語で書かれてるんだが…
2020/03/01(日) 14:28:49.88ID:4c8klxdl
シェルスクリプト製じゃないと、1つのファイルに出来ないじゃん
2020/03/01(日) 15:29:04.21ID:4tQoD8Fw
× シェルスクリプト用のオプションパーサー
○ シェルスクリプト製のオプションパーサー

質問するときは明確な言葉で。
2020/03/01(日) 16:13:34.61ID:DvIm3g7W
ID:4c8klxdlの無能さ
724デフォルトの名無しさん
垢版 |
2020/03/02(月) 16:01:50.45ID:s5dtAso/
外部コマンド使いなくないならBusyBoxみたいなの使うしかないよな。
2020/03/02(月) 16:35:15.54ID:+7p1D0tE
ビルトインコマンドでいいじゃん
2020/03/02(月) 23:40:28.80ID:8PHDRupm
-help が --help の書き間違いには、ならない。
-help は、h,e,l,p のオプションを連結した書き方で、文法的に正しいから

だから、オプションの連結を禁止すればよい

そうすれば、-h, -e, -l, -p みたいに、書かないといけないから、
-help は、絶対に間違いになるから、指摘できる

オプションの連結は、情報処理の教育を受けた社員を想定しているから、
勉強していないような素人には、難しすぎるw
2020/03/03(火) 07:08:07.59ID:IKAJxND7
根本は中国人なのにマスコミも政府も絶対言わないし、
制限しない。

311の政府対応と同じ

政権変わっても変わらん
2020/03/03(火) 07:53:58.76ID:4u1zxYLS
誤爆するガイキチ
2020/03/03(火) 09:24:57.55ID:MNbayHdo
>>726
情報処理の教育を受けた社員しか想定していないので問題ない
2020/03/03(火) 10:15:38.32ID:l2g6jfLd
あとは自力で勉強探究心があるギーク向けだしな
2020/03/03(火) 10:44:21.85ID:z64lrdXB
find「せやな」
2020/03/03(火) 12:18:09.49ID:3ukr+OhM
任意のオプション引数ってさ、
-help が -h elp って解釈されるよね?
-h -e -l -p とどうやって区別するの?

-help って書いた時どっちの意味になるの?
733デフォルトの名無しさん
垢版 |
2020/03/03(火) 12:32:47.35ID:yHaKKNdM
あるスクリプトを作っていて、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.02ID:5O39EjRd
>>733
~/bin/script.sh をシンボリックリンクではなく
cd ~/src && exec ./script.sh "$@"
を実行するシェルスクリプトにする
735デフォルトの名無しさん
垢版 |
2020/03/03(火) 14:06:21.11ID:yHaKKNdM
>>734
いろいろあって、そこはシンボリックじゃないとだめなんですよ
2020/03/03(火) 17:07:25.01ID:FfxSBx1I
>>732
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html
ここ読んで、どうぞ。
2020/03/03(火) 17:55:54.44ID:n9Ghdw3q
>>733
inc.shも~/bin(や特定固定のとこ)にシンボリックリンクを置いてしまえ
とか
pathme="$(which "$0")";
[ -L "$pathme" ] && pathme="$(readlink "$pathme")"
. "$(dirname "$pathme")/inc.sh"
とか
2020/03/03(火) 18:16:56.75ID:n9Ghdw3q
>>733
>~/bin/inc.sh を読み込もうとしているからだと思いますが
./inc.sh とかいう相対パスは現在のワーキングディレクトリ/カレントディレクトリからのだよ。sourceも同じく特殊なことはせずに
"$(pwd)/inc.sh" を読み込もうとしているのだろう
2020/03/03(火) 19:32:36.52ID:PcLjcySC
>>737
やっぱりreadlink使うしか無いですかね。
シンボリックのシンボリックのシンボリックとか考慮すると
readlink -fが必要になるけど、macOS版だとgreadlinkじゃないと動かないし
そもそもgreadlinkが入ってないとか、その他のOSではどうなるの?とか。
そういう面倒なコードはライブラリにしたいけど、そのライブラリを読み込むのに苦労するというw
2020/03/03(火) 19:58:06.90ID:BC6YzT5m
後出しかよ
シンボリックのシンボリックのシンボリック
なら、三行書けばいいだけじゃん
やっぱりって何がやっぱりなんだか
2020/03/03(火) 20:06:11.93ID:BC6YzT5m
pathme="$(command -v "$0")" || pathme="$0"
[ "$pathme" = "" ] && pathme="$0"
while [ -L "$pathme" ]; do
pathme="$(readlink "$pathme")"
done
. "$(dirname "$pathme")/inc.sh"
で、いいんじゃねえのかよぉ?なんでこんな簡単な対処も?と思うのでなんか穴があるか???
whichってPOSIXじゃなかったのね。煩そうだからそこも
2020/03/03(火) 20:07:32.72ID:BC6YzT5m
あ、二行目はいらない。もしくは一行目の||の後ろ
2020/03/03(火) 20:41:22.45ID:Lk6RorVj
>>740
沸点低すぎ。自分が欲しい情報を最初から全部準備しておけってか?
間違えるのが怖いってやつだなw
2020/03/03(火) 20:47:57.53ID:BC6YzT5m
なんかぐちぐち言っているけど、そんなこと対処すぐ自分でできるでしょなことをぐちぐちとという
ぐちぐち言う奴にはリアルでもムカつく沸点は低いのは確かだがなw

それと後出しなら当然のようにではなくて、すまんがが先にありがだろうに、何を当たり前のようにというのだな。リアルでもねw
2020/03/03(火) 20:55:19.44ID:dHOuVCIc
意訳 謝罪しろ
2020/03/03(火) 20:57:44.45ID:BC6YzT5m
そう読めるなら、沸点は俺より低すぎだな
2020/03/03(火) 20:59:54.63ID:FfxSBx1I
つまり自分の沸点の低さは自覚してるって訳か。
ひとまず安心した。
2020/03/03(火) 21:00:37.28ID:BC6YzT5m
うむ。キレやすく冷めやすいなw
2020/03/03(火) 21:01:39.37ID:UParEwxG
相手が何も考えてないと思ってるんだろうね。
そのやり方にはこういう問題があるって言ったら、
知ってるなら先にかけ!だもんな(苦笑)
2020/03/03(火) 21:04:21.79ID:BC6YzT5m
読めてないな、全然w
のくせに絡みたいのね。苦笑がいい味付けだねw苦笑いするぞ
2020/03/03(火) 21:05:27.34ID:V11R45Nz
毎度ながら回答者に問題があるよな

  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\
2020/03/03(火) 21:07:13.53ID:BC6YzT5m
何をそんなにひ弱なのかわからん...当事者でもないのに
>>740でそんなにダメージ受けるのか?一応ちゃんと回答してもいるんだがな。ひ弱すぎだろう
2020/03/03(火) 21:44:55.64ID:FfxSBx1I
弱い犬ほどなんとやら
2020/03/03(火) 21:53:18.68ID:BC6YzT5m
本題ではない瑣末wなことに拘るねえ、延々と。その動機がわからん
そう言うことだよ、皮肉屋さん
2020/03/04(水) 00:47:20.27ID:Hp65i7gp
煽るわけじゃないけどさ、シェル芸してる人って
アルゴリズムと呼べるようなコードを書ける人が少ない気がする

スクリプト言語で用意されてる便利な関数は使えても
その関数を自分で実装することはできないレベル
C言語で簡単な設定ファイルのパーサーも作れなさそう
2020/03/04(水) 01:10:12.01ID:nNNW6i++
>>733
Ruby で言えば、

require './file' は、カレントディレクトリからの相対パスだけど、
require_relative './file' は、現在のファイルからの相対パスになる

つまり、require_relative './file' は、__dir__ + "/file"

__dir__ は、現在のソースファイル(__FILE__)のあるディレクトリ名を、正規化された絶対パスで返します。
シンボリックリンクも解決されます
757701
垢版 |
2020/03/04(水) 01:34:09.01ID:nNNW6i++
>>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"}
2020/03/04(水) 02:42:11.83ID:NN2zD8QV
知恵袋の最後の方で回答している気でいる雑種かな
2020/03/04(水) 05:44:22.12ID:aHZx5rgw
>>755
シェル芸ってなんの話?
2020/03/04(水) 08:01:55.10ID:1RejiZvB
>>759
qiitaとかtwitterでシェル芸で検索するとわかるよ
難読化(笑)とか意味のないことを一行でやったすげーとか言ってる連中

シェルスクリプトにもプログラムを書くのに必要な機能はあるのに
一行(シェル芸)で書くか、さもなければ他の言語のライブラリを使うしかないって考えてる連中

シェルスクリプトで一行で書けなければ、他の言語を使って数行かけて書くが
そもそもシェルスクリプトで数行書けば、他の言語より短く実現できたりするのに
アルゴリズムを書く能力がないからそれができない。そういう奴らが好きな言葉がシェル芸

目的の機能がないと何も出来ない。プリミティブな機能を使って実現する思考能力が欠けている
2020/03/04(水) 08:06:58.23ID:Eb7SAM7+
このスレでのだろう
自分がただ嫌悪しているのをいきなり表明されても
2020/03/04(水) 08:12:50.48ID:1RejiZvB
新しい話題を始めただけやで
2020/03/04(水) 11:31:06.93ID:8C7aLz+2
一般論だが
目的が解決できれば解決策は簡単な方がいい
シェルスクリプトで一行で書けるのならそれにこしたことはない
シェルスクリプトだと処理の限界もあらかじめ分かっているというおまけつき
2020/03/04(水) 11:53:24.17ID:nNNW6i++
シェル芸は、Software Design で、上田隆一が連載しているものだろ。
次回で連載終了だけど

たいてい、awk を使う
2020/03/04(水) 15:48:52.99ID:Tzh2DSUj
>>764
シェルスクリプトでプログラミングしないなら
「POSIXコマンドプログラミング」って改名したほうが良いと思う
awkプログラミングでもいいけどなw

シェル(CLIから実行するもの)とシェルスクリプト(.shファイルにまとめたもの)と
厳密に区別してるならいいけど、実際にはシェルスクリプトの中でシェル芸してるんだよなw

例えばRubyなんかでも外部コマンドを呼び出せるわけでRubyのなかでシェル芸もできる。
これをRubyコードと呼べるかというと疑問がでるだろう?それと同じ。

>>763
> 目的が解決できれば解決策は簡単な方がいい
という条件からすると、Rubyのなかでシェル芸するのが正解なパターンは結構多いと思う。
でもやらないことの方が多いだろう。理由はなんだろうか?処理速度かな?
その理由と同じものが、シェルスクリプトにも当てはまると思う。
つまり(Rubyの場合と同様に)シェルスクリプトの中でシェル芸すんな(笑)

> シェルスクリプトだと処理の限界もあらかじめ分かっているというおまけつき
一行では書けなくても、数行書けば実現できることも多い。
シェル芸しかできないから、一行で書けなければムリと諦めてる奴が多い。
たとえばRubyだと1行でできることが、C言語だと数行かかることは多いが、
それを「C言語の限界」と言うやつはいないだろう。だけどシェルスクリプトだと
それをシェルスクリプトの限界だと言う。単に自分の力の限界なだけなのにな。
2020/03/04(水) 16:11:16.83ID:nkrxx/zT
>>765
> 単に自分の力の限界なだけなのにな。

うむ、納得
2020/03/04(水) 16:14:02.93ID:yiNVycVp
ロジックが整理されておらず
バグが多数潜んでるシェルスクリプトかのような長文

言語が考え方に影響を与えることが分かるいい例だな
2020/03/04(水) 16:37:48.08ID:Tzh2DSUj
>>767
理由が書いてない、説明がまったくないので同意しないw
自分が思ったことつぶやいただけだな
2020/03/04(水) 18:50:02.63ID:RW1/oxrb
いちゃもんつける(自分のストレス発散)のが目的なもんだから
段落ごとの方向性がバラバラでつながりが無い/意味不明な文章
2020/03/04(水) 19:11:58.65ID:Tzh2DSUj
というレスはイチャモン以外の何物でもないけどなw
771デフォルトの名無しさん
垢版 |
2020/03/04(水) 23:41:25.17ID:ito9Fws2
>>733
. inc.sh
にすればPATHから探す
2020/03/04(水) 23:48:29.11ID:NdgTFoKb
>>771
PATHから探したいんじゃないぞ
773756
垢版 |
2020/03/05(木) 00:24:52.81ID:PBcHTAfh
>>756
に書いてある

つまり、カレントディレクトリからの相対パスではなく、
このファイルからの相対パスになる

だから、このファイルがあるディレクトリの絶対パスを求めて、
それに相対パスを加えるとよい
2020/03/05(木) 00:25:52.24ID:npHipiyQ
>>773
絶対パスってどういう意味で言ってる?
2020/03/05(木) 01:35:06.58ID:HPS3pF1O
>>758に納得してしまう
776756
垢版 |
2020/03/05(木) 04:40:53.09ID:PBcHTAfh
>>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
2020/03/05(木) 07:57:16.42ID:GG3NZ1nL
ただのガイキチか
2020/03/06(金) 15:44:20.26ID:el16gBAN
Rubyの人に質問するけど
Rubyでは引数処理に便利な機能って標準で提供されてるの?
2020/03/06(金) 16:18:48.95ID:dB1opsgL
すでに書かれてるだろ。自演か?w
興味あるならあれが標準かとか具体的なのは自分で調べろよ、もしくはRubyスレでだな
2020/03/06(金) 23:22:42.71ID:VrRz91DJ
>>779
Rubyのヒトは会話を装う自演なんて高等なことはできないぞw
2020/03/06(金) 23:52:31.10ID:uvQVOrPP
ようやくbashに慣れてきたけど最低限覚えとけって言語はなんだろうか
頻繁に使うのはsed・awk・grep程度なんでやるならperlの方がいいのかね
今後のためにpythonをと言われても素人に使う機会ないわ
2020/03/06(金) 23:59:29.67ID:dfpAZ0dm
>>781
素人に使う機会がある
機能、用途を教えてくれないか?
2020/03/07(土) 00:00:23.26ID:z518jRtl
>>778
ARGV, ARGFが組み込み、OptionParserが標準添付ライブラリで提供されてる

ARGVは配列に引数が入ってるやつでだいだいどの言語にもあるやつ
ARGV[0]が実行コマンドじゃなく1つ目の引数になってるのが微妙に使いやすい

ARGFは引数でファイル名を受け取る場合と
標準入力でファイルを受け取る場合を1つの処理で書ける便利なやつ
Ruby以外では見たことない

OptionParserはショートオプション/ロングオプション/サブコマンドとかをサポートしてて
getoptやgetoptsに比べれば書きやすいし便利ではある
ただもっと高機能なgemもあるので依存性とのトレードオフでライブラリを選ぶ感じ

総じて簡単には書けるんだけどPerlなんかに比べるとインタプリタの起動が超遅いから
コマンド叩いてから処理が終わるまでの時間が比較的長い場合にしか使わない
2020/03/07(土) 10:41:41.36ID:EQxW6/Yc
>>780
どうだろう?w
785デフォルトの名無しさん
垢版 |
2020/03/07(土) 13:57:14.80ID:wqSODED6
if文でディレクトリの権限を確認するにはどうしたらいいですか?
-wをやってみたのですがうまく動作してくれません。
ファイルにしか使えないのですかね?
2020/03/07(土) 19:03:29.05ID:Tac4Jm8B
rootだからじゃね?いちおう対象がディレクトリも-wで書き込みの可否は返してるけど
787デフォルトの名無しさん
垢版 |
2020/03/07(土) 22:08:31.10ID:wqSODED6
>>786
動作としては書き込み権限の有無を確認し、無ければ付与するという動作が作りたかったです。
いろいろ調べたところrootだとパーミッションを無視するらしいので、
if [ ! -w ディレクトリ ]
上記の記載をしているスクリプトの実行ユーザがrootの為、全てにおいて書き込み権限があると認識されてしまっていると考えられます。
2020/03/07(土) 23:54:32.58ID:hanAtv/p
「chmod ディレクトリ」で検索!
789デフォルトの名無しさん
垢版 |
2020/03/08(日) 00:08:43.59ID:rfEr1WGY
>>788
chmodでディレクトリの権限を000にしても可能でしたが…
2020/03/08(日) 00:50:11.68ID:TYqtbVyi
パーミッションチェックじゃなくて書き込みができるか?だったはず
791デフォルトの名無しさん
垢版 |
2020/03/08(日) 02:47:35.54ID:rfEr1WGY
>>790
そうなのですね。
それであれば、000にしてもrootは書き込み可能だから毎回書き込み権限が付与されないは正しい挙動ですね。
実行ユーザーを一般ユーザーに変えるか、lsの結果にwの文字があるかを判別する処理に変えるが対処法になりそうですね。
2020/03/08(日) 03:12:50.23ID:P20sq25k
>>791
そう、思い出した。ファイルのパーミッションを自分から読み書きできないように変更して
本当に読み書きできないか、-wや-rでチェックするコードを書いたら、rootの場合は
それが上手くいかなかった。だからrootではそのチェックをしないようにした。
2020/03/08(日) 05:16:19.40ID:Xv2JcybJ
rootの場合でも対象に書き込めるんだから真っ当な動作だわな
2020/03/08(日) 12:36:43.71ID:uLLaNXsz
rootが「一見書き込めない」ファイルは存在しうるけど
「書き込む許可をどうしても得られない」ファイルはシステムの不具合でもない限り存在しないからね。
じゃなきゃそのファイルを誰が処理するのかって話になる。

UID 0は自分が持ち上げられない岩は作れないのだ。
2020/03/08(日) 19:11:47.52ID:RzwfZ5D7
Read onlyでマウントしたのはボリュームはrootでも書き込めないよね。そもそも書き込めないメディアも
あくまでも-wは書き込めるかの判定だから使う側が勘違いしてるだけで判定としてはrootでも全く正常な動き
2020/03/08(日) 19:58:45.91ID:T8rZAzyK
cd -Lの-Lってデフォルト?
2020/03/08(日) 20:25:40.77ID:kizyo8RY
デファクトでデフォルト
798デフォルトの名無しさん
垢版 |
2020/03/08(日) 22:45:41.68ID:rfEr1WGY
>>795
スクリプトを一般ユーザーで実行した際に書き込み権限があるかを判別するって認識でいいんですかね?
rootだと基本全部書き込めるから、一般ユーザーくらいでしか機能しない処理のような気がします。
2020/03/08(日) 23:08:52.65ID:5CM70Uar
単に現在(のユーザで)書き込めるかどうか判別してるにすぎないざね。権限とかは置いておいて。書き込める=書き込める権限と言うのならそうかもしれんが

ちなみに、macOSだとロックというのがあり、ロックするとrootでも書き込めないよう
権限とかではなくて単に書き込めるかどうかだな。Read onlyでrootで書き込めないのもそうだし
権限を調べたいならrootではなくてだろうね。もしくは詳しく権限を調べるとか
2020/03/09(月) 01:15:25.69ID:EmgiRGOf
>ちなみに、macOSだと〜
macOSというかBSDだな。FreeBSD/OpenBSDにもあった、そして挙動が同じ
2020/03/09(月) 08:15:32.71ID:nSyyVcXg
>>798
> 一般ユーザーくらいでしか機能しない処理のような気がします。

逆じゃね?w
rootくらいでしか問題にならないでしょ

rootでなんか普通使わねーw
2020/03/09(月) 15:04:18.04ID:rWRx//dL
PWDってさ、スクリプト実行前に設定されるって思う?
2020/03/09(月) 15:50:41.07ID:sbrbbxpE
されてないシェルなんてあったらそのシェルのバグだろう
2020/03/09(月) 16:01:54.84ID:sbrbbxpE
いや、どいつもこいつも設定しないのか。意外だな
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.
まんまなのか(?)
2020/03/09(月) 16:26:06.84ID:sbrbbxpE
いや、スクリプトファイルの実行時にならされる、-c のコマンド羅列文字列の実行時にはされないかな?
2020/03/09(月) 18:07:49.62ID:bHKN7jy6
どのシェルも設定されるなーって思ってたらkshはされんかった
export $PWD=aaaってやって
ksh -c 'echo $PWD'したらaaaってでた
2020/03/09(月) 18:10:56.70ID:bHKN7jy6
-cだけじゃなくてksh a.shってやってもaaaってでたw
最初、echo $PWDの前に確認のためにpwdコマンドやっていて気づかんかった
kshだとpwdやったらPWDも設定されたw
2020/03/09(月) 18:14:17.37ID:bHKN7jy6
おぉ? kshだとcd .してもPWDは設定されんかったぞw
流石に別ディレクトリに移動したら設定されるが
2020/03/09(月) 18:33:20.75ID:6JwbfpR0
しまった。>>804,805は -c で " で括ってた。そりゃあ...すまん

kshも設定されない?(??)
export HOGE=hoge
export PWD=hage
ksh -c 'echo $PWD $HOGE'
ってやったら、(pwdの) hoge かな。バージョン違いかな? うちのは 93u+
2020/03/09(月) 18:39:14.18ID:bHKN7jy6
面白いなw
export PWD=aaaってやって以下のスクリプトを実行したら

echo $PWD # aaa
echo $(echo $PWD) # /home/ore
echo $PWD # /home/ore
ってなった。

どこで設定してるんだよwww
kshは93u+
2020/03/09(月) 18:40:22.34ID:6JwbfpR0
>>808
どういうテストなのかわからんけど、93u+ ではこんなん
$ cd /home
$ echo $PWD
/home
$ PWD=hoge
$ echo $PWD
hoge
$ pwd
/home
$ echo $PWD
hoge
$ cd .
$ echo $PWD
/home
2020/03/09(月) 18:40:35.23ID:bHKN7jy6
echo実行後にせってされてるのでは?と思う人のために

echo $PWD # aaa
echo $PWD # aaa
echo $(echo $PWD) # /home/ore
echo $PWD # /home/ore
2020/03/09(月) 18:41:47.16ID:6JwbfpR0
>>810
同じか。ナゾだなw
2020/03/09(月) 18:42:40.76ID:bHKN7jy6
>>811
あ、kshに入ってから実行してるわけじゃないよ
bashからksh -c とか ksh a.sh とかしてる

ksh上でやってるならプロンプト表示する処理の
どこかで設定されてるのでは?
2020/03/09(月) 18:45:40.99ID:bHKN7jy6
echo $PWD # aaa
:
echo $PWD # aaa

-----

echo $PWD # aaa
$()
echo $PWD # aaa

-----

echo $PWD # aaa
$(:)
echo $PWD # /home/ore

サブシェルに入ってから?なんか実行すると設定されるっぽいw
2020/03/09(月) 18:46:18.77ID:6JwbfpR0
$ ksh -c 'PWD=hoge;echo $PWD;cd .;echo $PWD'
でも、
hoge
/home
かな
2020/03/09(月) 18:48:20.68ID:bHKN7jy6
つまりkshで安全に$PWDを使うためには
最初の方で$(:)を実行しておけってことだなw
これが最速の方法か知らんけど、pwd > /dev/null よりかは速そう。いやどっちだろ?
2020/03/09(月) 18:50:28.04ID:bHKN7jy6
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
ってでる
2020/03/09(月) 18:51:54.13ID:bHKN7jy6
ははは、ワロスワロス。どうなってるのか考えたら、頭がこんがらがってきたw
2020/03/09(月) 18:55:32.91ID:6JwbfpR0
なるほど
PWDがexportされていたかに影響するのか、イミフだな
exportされてるされてないで、pwdでのPWDも動作違う(?)
2020/03/09(月) 19:04:32.47ID:bHKN7jy6
PWDはデフォルトでexportされてるはずだから

cd /home
PWD=hoge
ksh -c 'PWD=hoge;echo $PWD;cd .;echo $PWD'

これも
hoge
hoge
2020/03/09(月) 19:05:54.23ID:bHKN7jy6
ムリw バグっぽいけど、どういうバグなのか頭が働かないw
2020/03/09(月) 19:11:00.02ID:bHKN7jy6
スクリプトの中から
さらにksh -c 'echo $PWD'してもPWDはaaaのままだたけど
(echo $PWD)するだけで/homeになるな。
つまりサブシェルを使うと、サブシェルの外のPWDの状態が変化する
2020/03/09(月) 19:20:17.23ID:6JwbfpR0
うむ、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
2020/03/10(火) 00:15:26.42ID:oWfapBN9
files="/Users/aaa/Documents/*"
for filepath in $files;
do
case $filepath in *.txt)
echo $filepath
esac
done

このcaseをifに置き換えた場合がうまくできません
ご指導よろしくお願いします
2020/03/10(火) 00:18:49.52ID:Cf5scsdy
forからやり直して下さい
2020/03/10(火) 00:20:14.51ID:QrvPekFm
caseでいいやん?なんでifに置き換えるのさ。意味ない。
2020/03/10(火) 06:34:25.94ID:fD+LS7Hr
単に拡張子を判断したいってだけじゃね。それも txt 一つだけとか。だとしたら、
if [ "${filepath##*.}" = "txt" ]; then
echo "$filepath"
fi
とかにしたくなるのもわからないでもない
2020/03/10(火) 08:08:24.53ID:oWfapBN9
>>827
勉強中でどうすればいいかわからなくて色々試してる最中です
if [[ $filepath = *.txt ]]; then
[[]]としたら出来ました
files="/Users/aaa/Documents/*.txt"
こうしたらcaseもifも不要でシンプルに出来ました
>>828
勉強になります。ありがとうございます
2020/03/10(火) 10:13:09.27ID:KDNpqv0e
>>828
なんでそんなにifにこだわるんだろうかね

if [ "${filepath##*.}" = "txt" ]; then
case $filepath in *.txt)
if [[ $filepath = *.txt ]]; then

どれがシンプルかは比べてみれば明らかだろうに

caseはcase一つで実現しているが、ifは別途 [ または [[ を
組み合わせてるから無駄な処理を行ってるんだが
文字数も長いし、[[はbash依存

パターンマッチングをcaseからifに置き換えても
文字を長くして無駄な処理を行って動くシェルを減らしているだけで
メリットが一つもない
2020/03/10(火) 16:38:10.67ID:HVuW4BfF
一つだけなのにcaseを使うのが気持ち悪い、判断パターンをcaseの後に書くのが気持ち悪いという感性の問題だな
どの感性が良い悪いというのではく。コーディング規約が一つにならないのと同じような
お前は俺のコーディング規約が絶対と言って譲らないのと同じ
2020/03/10(火) 22:41:26.01ID:DGocRqod
コーディング規約と漠然にいってるけどその内容には二種類あって、
一つは「理由がある良いやり方」と
もう一つは「どちらでも良いけど統一しましょう」というだけのもの

理由があるものはどちらが良いか明確に言うことができる。
明確に言えないものはインデントのスペースを2にするか4にするかという
統一だけするもの。コーディング規約にはこの二つが混じっているから、
良いか悪いかの話ができるものまで、好みの話だと勘違いしてる。

感性が邪魔して良い方法を採用することが出来ないという気持ちはわかるが
今回は明らかにcaseを使ったほうが良い。他にifの方がいい理由があれば
トレードオフの話に持っていけるが
2020/03/11(水) 02:59:38.62ID:nI7VA1ob
しつこい
2020/03/11(水) 03:56:24.84ID:arwb9WsV
俺様が決めたコーディング規約に従えねぇってかごるぁ
ということを言いたいんだろうな。caseは正義なんだと。
2020/03/11(水) 04:45:38.32ID:ZeFz9OTM
承認欲求のひとつだろな
2020/03/11(水) 09:22:15.60ID:FWSDJbu9
>>834
コーディング規約の話なんかしてないだろ?
この場合は、caseの方が優れてるのに
ifを使いたいという"感性"を持ち出してきたアホが居るだけ
そのアホがコーディング規約がーとか意味不明なことを言ってるだけ
2020/03/11(水) 09:32:31.50ID:FWSDJbu9
この場合はcaseが優れてるね

case使えって言った!こいつどんなときでもcase使えって言った!
理由はコーディング規約だからそれに従えだって!


誰もそんなこと言ってないんだよなぁ(笑)
なんで優れてるかどうかの話をすり替えたんだろうね
2020/03/11(水) 09:35:24.46ID:arwb9WsV
>>836-837
>>833読んだ?
2020/03/11(水) 10:04:34.79ID:FWSDJbu9
>>838
自分がしつこいから、レスが来てるって思わない?w
2020/03/11(水) 10:35:05.80ID:9AoZOnAU
>>829を読むとcaseもifも使わないでシンプルに出来たと言っていて、本人はifになんか全然拘っていないんだよな。何故か勝手にしつこく敵視してる笑。
2020/03/11(水) 10:40:57.60ID:FWSDJbu9
敵視してるのは>>831だぞw
2020/03/11(水) 15:58:19.41ID:6PQL09wH
これがアスベというのだな
2020/03/11(水) 18:51:36.11ID:6kL2fYSe
無駄なcat的な何か
2020/03/14(土) 09:40:09.35ID:H7XbSJpX
知らんかったけど、こんな書き方できるんやな

cat << HERE |
abc
HERE
sed s/a/b/g

cat <<HERE &&
abc
HERE
echo abc

謎な書き方多すぎw
2020/03/14(土) 09:44:21.77ID:H7XbSJpX
cat <<HERE && cat<<HERE
aaa
HERE
bbb
HERE

わろたw
これも動くんだ
2020/03/14(土) 11:50:07.06ID:9+oeBXql
zshだとOKだけどbashだけど文法エラーになるものってあるかな?

例えばbashだとOKだけど、shでは文法エラーになるものに配列がある。

$ bash -cn 'a=()'
$ sh -cn 'a=()'
sh: 1: Syntax error: "(" unexpected

これのzsh版
2020/03/14(土) 11:52:32.93ID:9+oeBXql
ただしこれは除く

$ bash -cn 'foo() :'
bash: -c: 行 0: 予期しないトークン `:' 周辺に構文エラーがあります
bash: -c: 行 0: `foo() :'

これはshでは通る。POSIX準拠の構文なはず。だけどbashが通らない珍しい例
$ sh -cn 'foo() :'
848デフォルトの名無しさん
垢版 |
2020/03/14(土) 15:19:53.15ID:4q4RZYWz
環境はMac mojave、lsとecho $(ls)とで挙動が違うのってなんででしょうか
前者はスペースや改行がしっかりされてるんですが後者は整形されませんでした
2020/03/14(土) 15:51:10.82ID:ILPzjwAA
lsは出力先によってオプションを指定しない場合のdefault formatが変わる
そういう仕様
2020/03/14(土) 16:50:55.95ID:cW1wo+Y7
>>848
echoなんぞに引数で渡す場合は、引数として渡すために分割されてるからじゃね。逆に整形されてるとも言える
echo "$(ls)"
(IFS=''; echo $(ls))
だと同じくならなくね?
2020/03/14(土) 17:16:06.25ID:aw8SOrjK
>>848
echoは複数の引数を(IFSの値とは関係なく)
スペースで区切ってくっつけるという仕様だから
2020/03/14(土) 17:30:36.50ID:ILPzjwAA
$ echo "$(export COLUMNS=159; export CLICOLOR_FORCE=1; ls -C)"
これでlsだけの時と同じ出力になった
2020/03/14(土) 17:34:32.34ID:aw8SOrjK
それは一つの引数の中に改行があるからな

別の問題として最後に複数の改行があっても一つにまとまるから
厳密には同じではない
2020/03/14(土) 17:48:52.56ID:Qg6b8RMl
なにいってるの
2020/03/14(土) 17:52:54.94ID:aw8SOrjK
正しいことを言ってる
2020/03/14(土) 17:55:17.78ID:Qg6b8RMl
変わったやつなのはわかった
2020/03/14(土) 17:56:25.94ID:aw8SOrjK
教えてほしいなら、何を教えればいいか具体的に言おうねw
質問者のくせに
2020/03/14(土) 17:58:01.23ID:Qg6b8RMl
おかしなやつだったか
2020/03/14(土) 18:01:56.55ID:aw8SOrjK
まーた始まった
2020/03/14(土) 18:20:00.64ID:tUDMKnWI
お前がな
2020/03/14(土) 21:45:32.98ID:fgvgQcum
>>844
その仕様は Perl にも受け継がれてるよ。
2020/03/14(土) 23:56:32.86ID:9VuyfYoc
echo は、連続した空白を、1つにまとめる
2020/03/15(日) 00:05:16.78