X



シェルスクリプト総合 その27
レス数が1000を超えています。これ以上書き込みはできません。
0599名無しさん@お腹いっぱい。
垢版 |
2018/06/13(水) 11:34:13.17
$ cat <<. <<.
1AAA
.
2BBB
.
とやると
2BBB
とだけ出力されるんだけど、これどういう理屈か分かる?
標準入力ってヒアドキュメントでさえ上書きされる仕様なの?
0601名無しさん@お腹いっぱい。
垢版 |
2018/06/13(水) 12:01:06.03
>>598
なるほど。だから「さいごに〜」とか話に全く関係ないことを言い出したのねw

>>599
ヒアドキュメントって標準入力として読み取るものでしょ?
そこは何らおかしくない

cat < /proc/loadavg < /proc/uptime
ってかいて、/proc/uptime からしか読み込まないのと一緒だと思うよ
0603名無しさん@お腹いっぱい。
垢版 |
2018/06/13(水) 16:23:41.49
>>601
なるほどね
$ somecmd < a.file < b.file
↑これでb.fileしか読み込まれないのも(やったことなかったから)知らなかった。
ありがとう
0610名無しさん@お腹いっぱい。
垢版 |
2018/06/14(木) 20:52:33.17
findでexecオプションの引数のあとにシェルに渡すパイプを付けるとexecに渡したコマンドがシグナル13パイプ破壊を出してくるんですけど
どうにかなりませんかね。
今のところ/dev/nullに標準エラー出力を捨てることで解決してるんですけども。
find . -exec basename \{\} \; | head
↑これで再現するはずです。
解決するときはできればPOSIXの範囲でやりたいです。findのGNU拡張で解決できるならそれでもいいんですが
メインPCがOS Xなので、最低でもBSD拡張、さらに言えばPOSIXに限定してほしいです すいません。
0614名無しさん@お腹いっぱい。
垢版 |
2018/06/14(木) 22:31:37.92
>>613
単純にPOSIXの価値というかシェルスクリプト全体の有用性が見直されているだけでは
たとえば*BSDのスレでGNUライセンスに拘ったレスが連続するのはおかしいが
BSDライセンスを重視するスレがたくさんあっても別におかしくはないだろう
0615名無しさん@お腹いっぱい。
垢版 |
2018/06/14(木) 22:32:42.05
パイプでなのでfindとhead が同時にプロセスとして存在
findが標準出力に出力するとパイプを通して/パイプとして繋がってるheadの標準入力に入力として
headが目的を達して終了=パイプが無くなる、だがしかし、findは出力を続けようとし出力しようとしたらパイプが壊れてるうううっ

普通何もしなくても、パイプが損失したらSIGPIPEが飛んできて(強制)終了するんだけど(フィルタとしてもなUNIX的な望ましいデフォルト動作)、なぜかSIGPIPE無視して続けようという謎動作?

findとheadが直接は繋がっていなくてかもしれんが。パイプの送出側がSIGPIPEを無視って謎動作なのは変わらないかな
0616名無しさん@お腹いっぱい。
垢版 |
2018/06/14(木) 22:38:09.62
>>615
basenameが標準出力につながってるだけだから、findはwriteしないのでSIGPIPEを受け取らないよ。
basenameが事故死したのをfindが報告してるだけ。

というわけで、basenameが事故死したらfindを続けるのをやめるようにしてみた。
この方が無駄にbasenameを続けるよりよかろう。
find /var \( -exec basename {} \; -o -quit \) | head
ただし、最初の事故死についてだけはfindがおせっかいに報告してしまう。

あとはまかせた。
0620名無しさん@お腹いっぱい。
垢版 |
2018/06/14(木) 22:50:38.44
CentOS$ strings /bin/find | grep -i signal
signal
%s terminated by signal %d
FreeBSD$ strings /usr/bin/find | grep -i signal
なんもなし

以上、findのおせっかい度の差。
0621619
垢版 |
2018/06/14(木) 22:51:53.48
すまん間違えて送信しちゃった
$ find /etc -exec sh -c 'basename {}' \; | head
これでどうだろう。
-quitオプションはPOSIXの範疇ではないけどこれはPOSIXに準拠してる
ちなみに>>610のコマンドラインはDebian GNU/Linuxのfind 4.7で再現した。
0623名無しさん@お腹いっぱい。
垢版 |
2018/06/14(木) 22:57:07.67
>>621
ん? それSIGPIPEは回避できるけど別の問題が発生しない?
「basename: 余分な演算子 XXX」←みたいに怒られるんだが
あと
$ find /etc -exec sh -c 'echo {}' \; | head
↑これをやるとやっぱりSIGPIPEが出されるようだ。
0625名無しさん@お腹いっぱい。
垢版 |
2018/06/15(金) 00:03:14.56
>>610
>findでexecオプションの引数のあとにシェルに渡すパイプを付けるとexecに渡したコマンドがシグナル13パイプ破壊を出してくるんですけど

この動作は、POSIX的にはどうなの?
まずいというならPOSIX的にどうまずいの?
0628名無しさん@お腹いっぱい。
垢版 |
2018/06/15(金) 00:39:45.42
-execにこだわりがないのであれば、
find . -print0 | xargs -0 -L 1 basename | head
今度はxargsがお節介メッセージ出すけど、findはheadが終了したら終了する
0636名無しさん@お腹いっぱい。
垢版 |
2018/06/15(金) 23:13:05.02
>>634
こういうPOSIXにやたらこだわってるのって
なにかの精神障碍があるんじゃないの?
一度そういう病院で診てもらえ。
0640名無しさん@お腹いっぱい。
垢版 |
2018/06/16(土) 08:33:03.61
find /etc -exec basename \{\} \; |& head
これでエラーも出ず余計な出力も引っ掛らなかったんだけど
理屈が分からん
|& は標準出力と標準エラー出力両方を通すはずなので
SIGPIPEのエラーが出力されるはずだがgrepしても見当らない
0642640
垢版 |
2018/06/16(土) 10:31:40.54
>>641
すいません。それどうやって確かめたらいいですかね
0644名無しさん@お腹いっぱい。
垢版 |
2018/06/16(土) 11:10:29.82
stderrが(標準出力)のパイプになりの、そのパイプが無くなり、find自身がエラーメッセージをそれに書き込もうとしてSIGPIPEを受けるってとこか
find . -exec basename {} \; -o -print | head
としても同じように終わるってとこで
0646名無しさん@お腹いっぱい。
垢版 |
2018/06/16(土) 13:02:42.26
>>640
だれかこれをmacOSでやってくれない?
あれは確かSIGPIPEを受けとらないから
GNU findと違ってこの書き方だと不具合が起こりそうだ
0647名無しさん@お腹いっぱい。
垢版 |
2018/06/16(土) 13:15:44.53
>>646
>あれは確かSIGPIPEを受けとらない
いや、それはないだろう。単に>>621の違いじゃないの
macOS Sierra標準のbashはまだ |& をサポートしてないヤツみたいなので(??)、2>&1 | としたが同じくfindは終わる
0658名無しさん@お腹いっぱい。
垢版 |
2018/06/16(土) 19:58:16.75
まあPOSIXじゃないので質問者の要請は満たしてないよね
俺が提案するとしたらexecは使わず
find . | xargs -I @ basename @ | head
↑これ。
0663名無しさん@お腹いっぱい。
垢版 |
2018/06/16(土) 20:56:44.95
この問題って本質的には、 find は /etc の下の全部のファイル(10以上)を返すが、
head は 10行で打ち切ってしまうという矛盾にある。
そこは目をつぶるって方針なんだから、最初に書いてあったstderrを捨てるって
方法で正しいと思うよ
0667名無しさん@お腹いっぱい。
垢版 |
2018/06/16(土) 23:19:14.74
コマンドの重複を数える(つまり$PATHに登録され実行可能なファイルの重複を列挙する)一番短い方法をってなんでしょう。ただし確実に動作しかつ可搬であることが条件です。
僕が考えたのは
$ echo $PATH | tr ':' '\n' | xargs -I @ find @ \( -type f -a -perm -+x \) -exec basename \{\} \; | sort | uniq -c
です。
0670名無しさん@お腹いっぱい。
垢版 |
2018/06/17(日) 04:18:06.91
パスの中に空白が入ってる or PATHの中身が多すぎたらおそらくアウト
( IFS=:; find $PATH -type f -a -perm -+x ) | sed 's|.*/||g' | sort | uniq -c

( IFS=:; for i in $PATH; do find "$i" -type f -a -perm -+x; done ) | sed 's|.*/||g' | sort | uniq -c
0671名無しさん@お腹いっぱい。
垢版 |
2018/06/17(日) 08:19:10.40
できればsedでやりたいことなんですが
aaa
<<
bbb
>>
もしくは
aaa
<<bbb>>
というようなファイルがあったとしてaaaの次行から「>>」を含む行までを読み出したいです。
(aaaが存在する行はすでに具体的な数値で判明しています; ここでは42行目とします)
特に二番目の場合には sed -n -e '43,/>>/p'とやると43行目に「>>」があるのに見つけてくれません。
なにか手助けをおねがいします。
0672名無しさん@お腹いっぱい。
垢版 |
2018/06/17(日) 09:24:18.61
>>671
sed -e '42,/>>/!d' -e 42d
0679名無しさん@お腹いっぱい。
垢版 |
2018/06/17(日) 19:24:04.76
Windowsだと%TEMP%で一時ファイルの格納場所が指定できますがUnixではそういう環境変数はないのですか?
$TEMPとか
0683名無しさん@お腹いっぱい。
垢版 |
2018/06/17(日) 19:43:21.15
>>679
TMPDIR
かな
/tmp
が古からあるからな。TMPDIRが設定されていたら(OSとして初期設定されているか、なんらかの形でTMPDIR設定されてたら)TMPDIR。設定されてなかったら普通に /tmp かな
0684名無しさん@お腹いっぱい。
垢版 |
2018/06/17(日) 19:45:54.91
>>679,683
>TMPDIRが設定されていたら〜
って、TMPDIRを意識していればね。当然のように、んなの知らん、/tmp 一択ってのも普通にある
0685名無しさん@お腹いっぱい。
垢版 |
2018/06/17(日) 20:07:00.69
>>681
一応、TMPDIRはPOSIX標準環境変数らしい。 tmpfile(3)やmkstem(3)なんぞはPOSIXとしてはTMPDIRを参照しろとはなってないらしい
が、実装するならTMPDIR参照するだろうし、してる。ちゃんとtmpfile(3)やmkstem(3)やmktemp(1)などを使っていれば、誰でもなんだろうけどね
0691名無しさん@お腹いっぱい。
垢版 |
2018/06/17(日) 23:04:57.63
6.6 Aliases
...
Aliases are expanded when a function definition is read, not when the function is executed, because a function
definition is itself a compound command. As a consequence, aliases defined in a function are not available until
after that function is executed.

somefnc () { alias AAA='pwd'; }
somefnc
AAA
otherfnc () { AAA; }
otherfnc
0692名無しさん@お腹いっぱい。
垢版 |
2018/06/18(月) 03:25:19.77
aaa="cat /etc/*release | grep -E '^NAME='"
echo ${aaa}

上を実行すると、
$ ./hoge.sh
cat /etc/os-release | grep -E '^NAME='
こうなってしまいます。
cat 〜の結果をaaaに入れる方法教えて欲しいです。
0694名無しさん@お腹いっぱい。
垢版 |
2018/06/18(月) 07:01:47.43
>>690
関数の中でaliasが使えないと言うよりか、
関数の定義が実行された時点でのalias情報が反映される。

つまりシェルスクリプトを上から実行していって、
somefunc()関数定義文が見つかると、
この関数 "全体" に対して、alias展開処理が行われてから関数が定義される

だからsomefunc()関数定義文よりも前にaliasが設定されていれば
そのとおりに展開されるが、関数の中はすでにalias展開済みなので
もう処理されない
0695名無しさん@お腹いっぱい。
垢版 |
2018/06/18(月) 07:11:33.65
ちなみにこれだとうまくいく

somefnc() {
  alias AAA='pwd'

  eval AAA
}

evalは実行する段階でalias展開されるようだ
evalで実行する文は、実行段階ならないと
わからないのだから当然ではあるが
0699名無しさん@お腹いっぱい。
垢版 |
2018/06/18(月) 09:40:49.35
うちの研究室もすごいことになった。
ところで前々から関数のなかで alias が展開されないのを歯痒くおもっていたので
eval 使えばいいというのは非常に有益な Tips だわ。
0707名無しさん@お腹いっぱい。
垢版 |
2018/06/19(火) 04:10:29.03
関数の中、もしくはmakefileやcrontabで
aliasを使いたい状況っていうのがよくわからないが
どんなときに使うの?
aliasではなく変数とかじゃ駄目なの?
0708名無しさん@お腹いっぱい。
垢版 |
2018/06/19(火) 04:54:42.99
自分は引数を取らず固定されたフィルタはaliasで定義することにしている
例えばeraelコマンド(ERAce Empty Line)。
alias erael='sed -e "/^$/d"'
ただ大抵はシェルスクリプトの先頭に記述するのであなたの言う通り関数の中で宣言する意図は分からん。
0713名無しさん@お腹いっぱい。
垢版 |
2018/06/19(火) 06:31:47.07
>>712
いやまったく大差ない。
ただただaliasというだけ
分かってると思うが俺は別に「使え!」なんて言ってないから
そんな気にする必要ないぜ。
個人的な問題だから。
0717名無しさん@お腹いっぱい。
垢版 |
2018/06/19(火) 08:03:40.13
5chに貼られたソースコードをコピペするってwセキュリティ意識ゼロかよw
絶対こんなの相手に発注したくねぇww
0720名無しさん@お腹いっぱい。
垢版 |
2018/06/20(水) 02:21:04.28
somefunc() {
 echo "${1:='need a arg'}"
}
のような関数を作ったのですが引数なしで起動すると
-bash: $1: この方法で割当はできません
と怒られるのですがどうすればいいですかね。
0722名無しさん@お腹いっぱい。
垢版 |
2018/06/20(水) 03:34:23.66
>>721
ありがとうございます!
できました!
すいませんが、もしよければなぜ直接引数に:=変数置換を適用できないのか教えていただけないでしょうか。
例えば${1:-aaa}などはごく普通にできるので、不思議です。
0723名無しさん@お腹いっぱい。
垢版 |
2018/06/20(水) 05:12:57.83
bash: $1: この方法で割当はできません
bash: $1: cannot assign in this way

代入文を使って位置パラメータへの代入を行うことはできません。
Positional parameters may not be assigned to with assignment statements.
0729名無しさん@お腹いっぱい。
垢版 |
2018/06/20(水) 12:45:30.95
>>728
別に直接書き換えもできる。constを「自分で」付ければできないようにもできるけど
Cで書き換えるのは危険すぎるだけだな。配列/文字列等のメモリ境界保護なんてないから。OSによってはargvがメモリ保護域にあるのもあるだろけど
0731名無しさん@お腹いっぱい。
垢版 |
2018/06/20(水) 12:56:35.45
>>730
argvの指す先(char **argv/*argv[]の中身/値でいいの?)も変更できるよ
argv = myArgv;
argv[1] = myArg;
argv[1][0] = myChar;
どれもできる
0732名無しさん@お腹いっぱい。
垢版 |
2018/06/20(水) 15:25:21.41
ああそうか。728だけど,すごいまぬけな発言をしてたわ。
Cでのargvはあくまで約束事としての変数名だからなんの保護・制約も掛けられてないのか。
一方シェルスクリプトでは引数変数を明確に他と区別できるようになってる。
ただし半保護状態。
0733名無しさん@お腹いっぱい。
垢版 |
2018/06/21(木) 05:57:06.66
script(1)コマンドかそれと似たCLI記録ツールで、
~/.profile(←ここに~/.bashrcなどを読みこむコマンドが書いてある)を読み込ませたいのですがどうすればいいですかね。
0734名無しさん@お腹いっぱい。
垢版 |
2018/06/21(木) 06:34:26.14
>>733
#!/bin/sh
exec /bin/bash --init-file "$HOME"/.profile "$@"

こういうスクリプトを書く
ファイル名を mysh でホームに保存したとして、次のようにして script に使わせる

env SHELL="$HOME"/mysh script
0738名無しさん@お腹いっぱい。
垢版 |
2018/06/21(木) 09:45:45.51
bashの場合、インタラクティブでログインシェルでなければ.bashrcを読むはずだけど、それじゃ足らんの?
0740名無しさん@お腹いっぱい。
垢版 |
2018/06/21(木) 15:25:56.39
733です。すいません。もうひとつ訊きたいことがあるのですが
script(1)実行中はCOLUMNS=80,LINES=25に固定したいです。
しかしそのmyshに
export COLUMNS=80
などと記述しても反映されません。
~/.profileなどでは特にCOLUMNSの値を設定している訳ではないです。
これどうすればいいですかね
0741名無しさん@お腹いっぱい。
垢版 |
2018/06/21(木) 17:29:46.87
stty cols 80 rows 25
なんかLINESもってとこから、ターミナルのウィンドウサイズなんぞもってぽいけど、それは個々のターミナルアプリ次第&一方通行っぽい(COLUMNSの値を設定している訳ではないのはそゆこと)けど
0742名無しさん@お腹いっぱい。
垢版 |
2018/06/22(金) 07:10:56.19
シェルスクリプトってeval使えばメタプログラミングっぽいことできるよね。
例えば引数をfor文で増加さしてeval arg$i=\$$iみたいな。
0744名無しさん@お腹いっぱい。
垢版 |
2018/06/22(金) 08:56:09.19
evalは一番最初に現れたプリミティブなメタプログラミング機能だからまあ当然だな。
ちな最初にeval を発明した言語はLisp な。
0747名無しさん@お腹いっぱい。
垢版 |
2018/06/23(土) 10:04:22.34
evalは強力すぎて危険だからどの言語でも濫用はevil扱いだと思う。
REPLみたいにevalがぴったりした応用もあるから禁止はできんし、
シェルスクリプトは比較的ミニマムな言語だからevalしか解がないケースも多いけど。
0748名無しさん@お腹いっぱい。
垢版 |
2018/06/23(土) 11:22:58.87
「ミニマルな言語」って他には例えばなに?
それLLとはまた違うの?
いや煽ってるんではなくて単純に訊ねたい。
0749名無しさん@お腹いっぱい。
垢版 |
2018/06/23(土) 11:42:26.04
コマンド置換の入れ子の限界を試そうと思って
$ i=1; while true; do echo $i; eval $( (yes '$(echo' | head -n $i | tr -d '\n'); (yes ')' | head -n $i | tr -d '\n') ); : $((i++)); done
↑こんなコードを実行してみた。
100あたりから面白いくらいに遅くなっていく
しかし500くらいまで試したけど表示は続き、限界を探る目的は達成できなかった。
0751名無しさん@お腹いっぱい。
垢版 |
2018/06/23(土) 14:46:23.27
eval関連なんですがaliasの出力結果をevalする方法を教えてください。
具体的にはroot権限でlsがしたいのですが、その時通常のlsと同じオプションを付けて実行したいのです。
ですので(通常の状態での)alias lsの結果を変数かなにかに格納してそれを実行しようと思ったのですが良い方法が思い付きません。
そのコマンド自体もaliasにしたい(具体的にはls@rootコマンドとしてalias ls@root=の形で定義したい)です。

どうかよろしくお願いします。
0752752
垢版 |
2018/06/23(土) 14:52:25.95
すいません。一番上の行は無視してください。
evalでできるかなと考えてたプロセスが漏れてしまっただけです。
多分このアプローチは間違っているので無視してください。
0759名無しさん@お腹いっぱい。
垢版 |
2018/06/24(日) 22:14:10.69
>>748
データ型が少ないって意味でTclとかかな。
でもTclには文字列型の他に連想配列があるのよね。
POSIX shellの範囲内だと引数配列を除けばホントに文字列しかないので。
0760名無しさん@お腹いっぱい。
垢版 |
2018/06/26(火) 16:44:06.12
こんにちは

ド素人です。
VPSの立ち上げ時にスタートアップシェルスクリプトを使って効率化したいです。

とあるwgetを叩くと、user名とパスワード、パスワードの再入力を求められるのですが、
このuser名、パスワードをシェルスクリプトで入力させるにはどうしたらよいでしょうか。
0761名無しさん@お腹いっぱい。
垢版 |
2018/06/26(火) 17:04:46.28
wgetでgithub上にある既存のシェルスクリプトを叩くと
ユーザー名とパスワードを聞かれるのですが、
その入力を自動化したいという意味です。

github上のシェルスクリプトは変更できません・・・
0764名無しさん@お腹いっぱい。
垢版 |
2018/06/26(火) 17:29:12.30
>>761
相手側の要求に従ったuser名パスワードの提供方法をwgetでするとよいでしょう
どのVPS?どういう相手側のサービス?その使ったというはGitHubのどれ?
https://gist.github.com/kevinold/216077/4d725773b46a2ac32c0f5a689339d3da004d7f5d
これでいいのか?適当にぐぐったらVPSだしwget使ってるしw

>>762
まあ、なんかセットアップでコマンド叩いたりするのだろう。そういえばwgetで認証できなかったら再入力なんて求められないよな...??あったかな??
0766名無しさん@お腹いっぱい。
垢版 |
2018/06/26(火) 18:04:40.17
httpのBASIC認証やftpのならそれで問題はないよね。普通にBASIC認証でそのオプションを教えてっていうことだけかな
0768名無しさん@お腹いっぱい。
垢版 |
2018/06/26(火) 19:26:12.11
wgetが書かれたシェルスクリプトを呼び出すシェルスクリプトを書きたいように見えるが…
まあ質問が日本語的に不自由すぎるね
0769名無しさん@お腹いっぱい。
垢版 |
2018/06/26(火) 20:51:22.89
wgetがBASIC認証を要求してくるんですが、
パスワードをシェルスクリプトに書きたくないです。
別ファイルに生パスワードを書くのも嫌です。
かといって毎回入力するのは面倒です。

ssh-agent利用して最初に一回いれて覚えさせるだけで
あとはパスワードなしにできたりしないですかね?
0770名無しさん@お腹いっぱい。
垢版 |
2018/06/26(火) 21:11:05.80
ssh-agent/ssh-keychainはどうなんだろ、無理じゃねと思うが、keyring(Linux/BSD)/Keychain Access(macOS)を使えばふつーにできるだろうな
0771名無しさん@お腹いっぱい。
垢版 |
2018/06/26(火) 21:17:58.64
最初の質問と内容か変わってるし、パスワード書きたくないらしいので、役にたたないだろうけど、俺ならexpectでスクリプト書く
0774名無しさん@お腹いっぱい。
垢版 |
2018/06/27(水) 00:54:07.84
jqについて教えてください。

https://ideone.com/SZlhR4

やり方が分からないので、以下のようにとりあえすyenを指定したら並び順が思ったようになりませんでした。
$ cat kudamono.json | jq -r '.genre_name, .list[].name, .list[].hinshu_list[].yen'

くだもの
りんご
みかん
いちご
180
500
200
50
63
300
null
null
null

続く
0775名無しさん@お腹いっぱい。
垢版 |
2018/06/27(水) 00:54:30.18
以下のように標準出力に出す方法を教えてください。

くだもの
りんご
ふじ
180
サンふじ
500
つがる
200
みかん
きんかん
50
いよかん
63
せとみ
300
いちご
あまおう
null
ひのしずく
null
とちおとめ
null
0781名無しさん@お腹いっぱい。
垢版 |
2018/06/29(金) 00:29:23.70
dashはPOSIX準拠である
だからPOSIX準拠のコードはdashで期待どおり動く
だけどdash専用のコードはPOSIX準拠ではない
0783名無しさん@お腹いっぱい。
垢版 |
2018/06/30(土) 22:10:41.02
あの,すごく初歩的なことだと思うのですが,
Excelなどのように隣のセルの値を参照して現在のセルの値を計算するという手法を
シェルスクリプトで行うにはどうすればいいでしょうか。
具体的には,参照した値をaとして,(1-sin^2(a))/2^aを計算したいです。
Excelだと,A列に値を入力していき,B1セルに「(1-(SIN(A1))^2)/2^A1」と入力した後ドラッグすればいいのですが……。
0789名無しさん@お腹いっぱい。
垢版 |
2018/07/02(月) 14:15:59.23
cat と echo,printf は全然違う。主に出力するソースが(ゆえにパイプで入力受ける受けないとなり?)
echo と printf は、書式が指定できるかというか、コマンド由来とC由来かな
printって?awk内のならprintはechoのようなもんかな(Ubuntuには print がコマンドであるけど Mailcap とかナニそれな普通じゃないのだな)
0791名無しさん@お腹いっぱい。
垢版 |
2018/07/02(月) 14:23:46.00
それらの違いが分からないのは使ってないからだろ
使ってないなら知る必要もないし知ろうとも思わない
自作自演かな?
0793名無しさん@お腹いっぱい。
垢版 |
2018/07/02(月) 14:27:23.78
コマンド由来とC由来ゆうてるやんw
printf(1) は printf(3) と同じと思えば不思議ではないだろう。echo も -n で改行しないようにもできるけどイレギュラー、コマンド由来だからな

>>791
まあ、なんの目的で聞いてるのかさっぱりわからんくはあるな。なんの自作自演なのかさっぱりだけど
0803名無しさん@お腹いっぱい。
垢版 |
2018/07/02(月) 14:50:43.52
>>796,797
コマンドで何か出力するのに「改行しない」方が少ないだろうという。echo "Hello"が改行しなかったらプロンプトが続いてとか。改行した方がその機会が多いので省けるだろう
f = フォーマット。printfはCが起源じゃないのかなあ。の前の何かの言語ではprintがあっただろうな(どういうのか知らんけど)

聞く姿勢が小学生低学年並みだな。そろそろ>>798の言うとおり
0806名無しさん@お腹いっぱい。
垢版 |
2018/07/02(月) 15:24:56.72
manとinfoどっち使ってる?
infoは文中から別のページに飛べるから便利そうだけどウェブブラウザのように戻る進むボタンがあるわけでも無いし全部文字だけだから現在位置が分からなくなるからmanがいいと思うんだけどどう?
0812名無しさん@お腹いっぱい。
垢版 |
2018/07/02(月) 19:09:02.32
man manて口で言うと恥ずかしいからinfo
0816名無しさん@お腹いっぱい。
垢版 |
2018/07/03(火) 00:21:24.80
ディレクトリの中の拡張子がm2tsのファイル全てをtsselectというコマンドに投げてその標準出力をひとつのファイルに追記で書き込みたいんですが、その際、ファイル名も一緒に書き込みたいです。
どうやってファイル名を取得するんでしょうか?

$ tsselect *.m2ts > ana.log
0819名無しさん@お腹いっぱい。
垢版 |
2018/07/04(水) 07:39:11.34
近頃のどこか(このスレかも)で,
「fgrepはgrepより遅い」というような話を耳にしたんですが,ほんとうですか?
手元のgrepで試したところ,ほとんど有意な差はありませんでしたが……。
0820名無しさん@お腹いっぱい。
垢版 |
2018/07/04(水) 08:10:45.64
それぞれ独自バイナリだった昔の話な。
あとgrepよりegrepの方が速かったんで、
今でも手はegrepを優先して打っちゃうけどな。
0822名無しさん@お腹いっぱい。
垢版 |
2018/07/04(水) 15:23:44.48
ファイルの一括リネームで
$ find . -name "*X*" | while read F; do mv $F ${F/X/Y}; done
だとXXXがYXXになるんですけどYYYにするには繰り返さなきゃいけないんですかね?
0829名無しさん@お腹いっぱい。
垢版 |
2018/07/04(水) 16:34:15.63
とりあえず「sh 変数展開」あたりでggってからここに来い
それで分からなきゃどこかの暇人が餌与えてくれるまでずっと待ってな
0832名無しさん@お腹いっぱい。
垢版 |
2018/07/04(水) 18:24:31.29
すみません
ワードとかに出来る~$で始まるファイルを一括で消したいのですがどうすればいいですか。
find ./ -name "~$*" -exec rm -rf {} \;
これだと上手くいかないです。
find ./ -name "~\$*" -exec rm -rf {} \;
エスケープしてもダメです。
find ./ -name "~*" -exec rm -rf {} \;
これだと上手くいきますが$も指定するためにはどうすればいいですか。
0834名無しさん@お腹いっぱい。
垢版 |
2018/07/04(水) 18:30:53.83
>>833
上手くいかないです
$ find . -name ~'$'*
Unknown user: $*.

$ find . -name "~'$'*"
Illegal variable name.

$ find . -name ~"$"*
Illegal variable name.

$ find . -name '~"$"*'
何も出力されない
0841名無しさん@お腹いっぱい。
垢版 |
2018/07/04(水) 21:21:14.22
最後以外の改行を削除する単純で可搬な方法を探しています。
私が現在使っている方法は
cat <<. | tr -d '\n' | printf '%s\n' "$(cat)"
a
bbb
cc
.
です。これは可搬性は抜群ですが、冗長すぎると感じています。
できれば一つのコマンド(sedとか?)で済ませたいです。よろしくお願いします。
0849名無しさん@お腹いっぱい。
垢版 |
2018/07/05(木) 10:23:41.12
>>848
え? そうなの?
OS Xを持ってないので知らんが Busyboxでも行けるくらいの可搬性はあるぜ?
全部POSIXで規定されてる命令だし。
0851名無しさん@お腹いっぱい。
垢版 |
2018/07/05(木) 14:18:26.92
主にパターンスペースに対して処理した直後にどうするってとこの違いかな。他ではBSDでもmacOSとOpenBSDでは行を処理しなかった場合どうするがちょっと動作が違ったり、いろいろ鬼門だなsedは

sed '$!{H;d;};${H;g;s/\n//g;}'
で、いちおう、sedもGNU sedものようだけど、ゴテっとはしてんな
0854名無しさん@お腹いっぱい。
垢版 |
2018/07/05(木) 15:51:48.45
おおっ
ラベルを別にすれば/しなきゃなのか
$はそこに入れるのか、なるほど
GNU sedではそれだと...オプションで変えられるかな
くせが強いw
0859名無しさん@お腹いっぱい。
垢版 |
2018/07/05(木) 22:10:39.00
sed で可搬性を考えると、セミコロンで分ける方法はちょっとあやしいから、
愚直に -e で分けるしか無いのかも知れない、短く書けないけどw

それはさておき、sed の「無限ループに N を入れる」って、趣があると思うんだよね。
C で「ファイルを while の条件文で fgets() が EOF になるまで読み込む処理」に近いというか。
0861名無しさん@お腹いっぱい。
垢版 |
2018/07/05(木) 23:00:24.55
>>859
溜めに溜めて溜め込んでってイメージしかないなw
そのwhile〜fgets〜で言うなら、中にreallocでどんどこ的な

実際どうなんだろと65Mのファイルで「ちょっと」試したら、使用メモリは増えない(??)けど終わらんぞw
0862名無しさん@お腹いっぱい。
垢版 |
2018/07/06(金) 00:57:10.67
bashのプロセス置換なんですけど、最初のプロセス置換が/dev/fd/63に固定(?)されているのはなにか理由があるんですかね。
bash-4.4$ eval echo $(yes '<(echo) ' | head -n 63)
とやったら/dev/fd/63からデクリメントされていって/dev/fd/5→/dev/fd/3→/dev/fd/64
という謎の変化を経てインクリメントされていくという……。
これ仕様ですかね。
0864名無しさん@お腹いっぱい。
垢版 |
2018/07/07(土) 19:05:22.41
数千行のCSVの値を一個一個指定の条件に沿っているかチェックするにはシェルスクリプトでも出来ますかね?
参考書教えて頂けたら嬉しいです。
それともこういうのは他のスクリプトの方が適してたりしますか?
perlも使える環境ではあります。
0865名無しさん@お腹いっぱい。
垢版 |
2018/07/07(土) 19:24:54.18
>>864
そのチェックが他の行の参照を含まなくて、shellでできるかという質問にawkやsedも含まれているのなら、できる
というか、excelでやったりしないし、最近はpythonでやることが多い
0867名無しさん@お腹いっぱい。
垢版 |
2018/07/07(土) 20:52:55.66
ああ、文字列の中のフィールドセパレータ(,)をフィールドセパレータとして除外というのはしないか。awkも同じかな。やってできないこともないだろうけどめんどくさいな
perlはcsv処理するモジュールを入れてだっけ、pythonは最初から入っているよな
0868名無しさん@お腹いっぱい。
垢版 |
2018/07/07(土) 21:04:50.61
それ以前にCSVのフォーマットによると思う
改行とかカンマとかダブルクォーテーションを含むとかをきちんとやりだすとシェルだけでもできるだろうけどやりたくない
0870名無しさん@お腹いっぱい。
垢版 |
2018/07/07(土) 23:12:15.86
カンマ入っている場合には "" もしくは '' で囲わなければならないから、それはシェルスクリプトにとっても都合がいい、
IFS=',' fields=($raw)
で簡単にと思ったがそう甘くはなかった。最近流行りのevalでなんとかだとしても、$とかまた別の問題があるしなあ
0872名無しさん@お腹いっぱい。
垢版 |
2018/07/07(土) 23:47:30.31
皆さんお答えありがとうございます。
出来るけど面倒だという感じですね。
PHP使いたいけど仕様上ダメみたいなんですよね。。。
後にメンテナンスが面倒くさそう
0876名無しさん@お腹いっぱい。
垢版 |
2018/07/09(月) 09:05:14.05
>>872
上とかけあってperl/python/rubyのどれかを入れさせれもらった方がいいと思う。
あるいはjava VMがインストールされてるなら、そっち使ってもシェルよりは楽。
0878名無しさん@お腹いっぱい。
垢版 |
2018/07/09(月) 15:13:46.00
1990年代には確かにこういうプログラムもCで書いてたが、今では はやらんよ。
スクリプト言語とかJava VM系言語とかでCSVライブラリ呼ぶように書くのが普通。
もっと低レイヤの処理ならCも使うけど、業務システムにCを使うってのは、
開発効率が悪いせいで、ほぼ亡びた。
0879名無しさん@お腹いっぱい。
垢版 |
2018/07/09(月) 19:00:09.14
compgenによる補完候補の絞り込みですが
bashでは正常に動作するもののzshでは絞り込まれません。
なぜでしょう?

# bash 4.4.19 on Ubuntu 18.04
$ compgen -W "aaa bbb ccc" a
aaa

# zsh 5.5.1 on Ubuntu 18.04
% compgen -W "aaa bbb ccc" a
aaa
bbb
ccc

.zshrcでは
autoload -U +X compinit && compinit
autoload -U +X bashcompinit && bashcompinit
してます
0881名無しさん@お腹いっぱい。
垢版 |
2018/07/10(火) 08:36:39.48
>>880
>>876は「java VMがインストールされてるなら」って書いてあるじゃろ。
つまりCSV処理のためにjava VM入れるんじゃなくて既に入ってるならって話。
入ってないなら交渉してスクリプト言語入れる方を推奨だな。

エンタープライズ系は静的型検査が欲しいので相変わらずjava VMな言語が強いのよ。
0882名無しさん@お腹いっぱい。
垢版 |
2018/07/15(日) 05:45:07.54
シェルスクリプトでwebpackみたいに結合して1ファイルにしてくれるものとか
babelみたいにトランスパイルすることで言語を拡張するものって無いかな
0883名無しさん@お腹いっぱい。
垢版 |
2018/07/15(日) 13:28:22.06
>>882
シェルアーカイブ形式とか?
file.sharという形で,ファイル後半に(圧縮した)バイナリーファイル,前半(というかヘッダ)に展開用シェルスクリプトとインストールスクリプトを書いておく)
最近のソフトウェアだとVMWare Horizon ClientsのLinux向けインストーラーがその形式だった。
0886名無しさん@お腹いっぱい。
垢版 |
2018/07/17(火) 14:15:20.69
>>885
だからぜんぜん違う
webpackみたいに1ファイルに結合するって話をしてる
結合しても結合する前と同じように動く
すこしはsharについて調べてきたら?
0891名無しさん@お腹いっぱい。
垢版 |
2018/07/17(火) 16:41:05.27
どう使いたいかとかわからんのにな
>>887って言ってるけど、得られるのは自分でそれを使ってダイレクトにも頑張ればできる範囲だし
0893名無しさん@お腹いっぱい。
垢版 |
2018/07/17(火) 19:48:43.74
バンドルじゃないの。macOSのバンドルのようなのを単一ファイルでの
単にincludeだったらシェルスクリプトにcatでくっつければええやん。目的は単一のファイルにしたいだけなんだから
バンドルなんだからバンドルをハンドルするヤツが必要じゃないの。んなのはshar使って自分で作ればってとこじゃね
0894名無しさん@お腹いっぱい。
垢版 |
2018/07/18(水) 07:15:49.95
webpackとかbabelとか覚えたてのキーワード並べてみたかったんでしょ
そんなのが必要になる状況がクソなんだがなw
0895名無しさん@お腹いっぱい。
垢版 |
2018/07/18(水) 10:45:31.69
>>891
> >>887って言ってるけど、得られるのは自分でそれを使ってダイレクトにも頑張ればできる範囲だし
自分で頑張ればできるって話なら、ファイル結合なんだからcatでもできるよ?
自分で頑張ればいいだけ。結合されても大丈夫なようにコードを書く必要があるけどな

その頑張るのが面倒だからツール使うんだろう?

ちなみにsharなんていらない。だってこれ目的を満たすためのツールじゃないから
自分でcatで頑張る+圧縮もしたいなーって思った時にオプションで使えるかもしれないツール
0897名無しさん@お腹いっぱい。
垢版 |
2018/07/18(水) 10:48:08.70
ちなみにsharの問題は展開しないと使えないって所
ルータのような書き込み回数に制限があるシステムでは致命的
0898名無しさん@お腹いっぱい。
垢版 |
2018/07/18(水) 10:48:51.53
あと展開のためのコマンドが入ってない可能性もあるしな
ファイル結合するだけなら、外部のコマンドにも依存しない
0899名無しさん@お腹いっぱい。
垢版 |
2018/07/18(水) 12:29:11.73
シェルスクリプトは実行可能なままファイル結合する必要性があんまりないってこと
そんなのとかトランスパイルとかが必要になるJavaScriptを指して、クソだなって言われてるんじゃない?
0900名無しさん@お腹いっぱい。
垢版 |
2018/07/18(水) 14:24:18.43
てゆうかそれ以前に、そんな長いプログラムをシェルスクリプトで書いちゃいかんやろ。
他の言語を使うべき。

JavaScriptくらい高級な言語ならアリだけど。
0901名無しさん@お腹いっぱい。
垢版 |
2018/07/18(水) 19:30:47.19
ディレクトリ A の中のファイルを全部
ディレクトリ B の中の同名のファイルと diff を撮りたいんですけどどうすればいいですか
xarg で1つの引き数を渡す方法しかわからないのでおねがいします
0905名無しさん@お腹いっぱい。
垢版 |
2018/07/18(水) 21:33:29.76
システムのスクリプトにも参考になるものがたくさんあるよね。zgrepとかzdiffとか
linuxだけどlddがシェルスクリプトだったのには驚いた
0906名無しさん@お腹いっぱい。
垢版 |
2018/07/18(水) 21:51:54.45
bashのHISTTIMEFORMATを設定した環境だと
sshログアウトしてもbgプロセス消えないみたいなんだが
なんでなん?
0908名無しさん@お腹いっぱい。
垢版 |
2018/07/18(水) 23:31:51.58
うーむ
会社の環境だとその設定の有無で変わったんだけど
今vmでcentのminimal立てたら設定なしにbgプロセス生きてた

何か勘違いしてるのか
0911名無しさん@お腹いっぱい。
垢版 |
2018/07/19(木) 10:02:38.02
>>910
高速化できるんならオプションじゃなく最初からそうしてると思うが、
さらに、高速化が必要なほど遅いcaee文とは?
0912名無しさん@お腹いっぱい。
垢版 |
2018/07/19(木) 10:34:16.62
>>902
Aにあるファイル名だけ比較したいんです
Bのなかにはほかにもファイルがあったりするので
diff A/$f B/$f
とか場合によっては
diff A/$f B/*/$f みたいなことがしたかったのです…

ls なり find なりの出力ファイル名を変数に取り出すのってやっぱり難しいんですね
諦めます
レスありがとうございました
0914名無しさん@お腹いっぱい。
垢版 |
2018/07/19(木) 11:19:41.98
find A -type fして、それぞれbasenameとって、find B -name filename -exec hogeってかんじかな。
B側で何度もfindするのを減らしたいけど、キャッシュされればそれほど負荷じゃないか。
0915名無しさん@お腹いっぱい。
垢版 |
2018/07/19(木) 12:11:39.09
diffの話ついでに
(GNU) diffでディレクトリごと比較したときに、一方のディレクトリにのみあるファイルを無視するオプションってある?
diff -r /dirA /dirB | grep -v 'にのみ存在'
とやればまあ大抵の場合解決するんだけども、たまたまあるファイルの変更箇所に「にのみ存在」っていう文があった時に
困るので、できればオプションで解決したい。
0922名無しさん@お腹いっぱい。
垢版 |
2018/07/20(金) 01:50:52.37
>>900
> てゆうかそれ以前に、そんな長いプログラムをシェルスクリプトで書いちゃいかんやろ。

行数で使う言語を決めるなや

シェルスクリプトは、コマンドの連携処理を一番シンプルに書くことができる言語
シェルスクリプトが適している問題を、長いからという理由で他の言語を使うともっと長くなる

なぜ非効率な言語を使うのか?
0926名無しさん@お腹いっぱい。
垢版 |
2018/07/20(金) 12:12:45.33
>>922
まさにシェルスクリプトがプログラム間連携のための言語だからだよ。
1000行以上にも及ぶ複雑なプログラム間連携処理を
シェルスクリプトで書く状況ってのは
モジュール分割に失敗してる可能性がきわめて高い。
100行くらいの単体でも十分に使えるシェルスクリプトが10個ならば問題ないが。

シェルスクリプトは現代的プログラミング言語の持つ数々の抽象化機能を
欠いていて大規模プログラミングに向かないことは常に意識するべき。
0932名無しさん@お腹いっぱい。
垢版 |
2018/07/21(土) 13:29:23.62
>>926
> 1000行以上にも及ぶ複雑なプログラム間連携処理を
> シェルスクリプトで書く状況ってのは
> モジュール分割に失敗してる可能性がきわめて高い。

だからシェルスクリプトでモジュール分割するんでしょ?
0937名無しさん@お腹いっぱい。
垢版 |
2018/07/21(土) 16:08:19.12
>>934
内部コマンドだけで処理できるなら
普通の言語のほうが良いよ

外部コマンドの連携に強いシェルスクリプトは
外部コマンドを呼び出すために使うもの

逆に普通の言語だと外部コマンドの呼び出しは面倒なんだ。
0939名無しさん@お腹いっぱい。
垢版 |
2018/07/21(土) 16:30:52.91
>>936
そういうのもできてるなら話題になってないって言ってるんだけど
できてるって、言語的にできるできないじゃないよ

>>938
板違いってか本題から外れすぎだな
0941名無しさん@お腹いっぱい。
垢版 |
2018/07/22(日) 22:44:37.34
やっぱ次のスレからワッチョイ付きにしようね
0963961
垢版 |
2018/07/24(火) 11:43:21.78
>>962
実はワッチョイを提案したのは俺なんだけど
あんまり賛同者がいないようだし
勝手にやるのもどうかなと思ったんだわ。
今はID板でやって
それでも荒れるようであればワッチョイ付けるっていう方針でいいかなと思ってる
0964名無しさん@お腹いっぱい。
垢版 |
2018/07/24(火) 11:51:50.17
>>963
俺はワッチョイも含めて賛成してたけど、まぁそれでいいか
ざっと厶板の他のスレみた感じワッチョイまで採用してるスレほとんどないみたいだし、あっちでもあまり使わない文化なのかもしれん、どうなんだろ
0969961
垢版 |
2018/07/24(火) 12:54:08.96
プログラム板ってここと違って保守しなきゃいけないよね
誰かどのくらいで落ちるか分かる人います?
0974名無しさん@お腹いっぱい。
垢版 |
2018/07/25(水) 04:22:56.20
UNIX板伝統のシェルスクスレもム板行きかあ
UNIX板に限らず、専門板って過疎ってるところ多いから、統廃合してほしいな
0975名無しさん@お腹いっぱい。
垢版 |
2018/07/25(水) 15:06:43.63
シェルスクリプトはもはやUNIXだけのものじゃなくなったからなぁ。
クロスプラットフォームが当たり前になって、
OS別のマターというのもだいぶ限られてきたね。
0976名無しさん@お腹いっぱい。
垢版 |
2018/07/25(水) 16:55:26.81
UNIX板の中でシェルスクリプト総合スレが一番、というか唯一勢いがあるんだが、
これなくなると凄まじい限界集落になるな…

Vim/Emacs/TeXあたりもソフトウエア板あたりなんか行ったら、もう…(´;ω;`)
0979名無しさん@お腹いっぱい。
垢版 |
2018/07/25(水) 20:33:48.37
WindowsではWSLでシェルスクリプトが動く
だけどWSL環境なんだよなぁ

Windows標準でbusyboxとか採用してくれればいいのに
バッチファイルの代わりとして使えるんだが
0981名無しさん@お腹いっぱい。
垢版 |
2018/07/25(水) 21:12:51.81
バッチの意味不明なsyntaxと貧相なコマンド類は発狂しそうになるけど、パワシェではいかんの?
パワシェ使ったことないけど、さすがにまともに設計されてるんだろ
0983名無しさん@お腹いっぱい。
垢版 |
2018/07/25(水) 23:38:49.24
Powershellは高機能なんだろうけど、高機能すぎて、あれこれ調べているうちに疲れた

結果として、Powershellの機能を呼び出すバッチファイルが出来上がってしまった
0984名無しさん@お腹いっぱい。
垢版 |
2018/07/26(木) 05:51:18.22
>>980
WindowsでもLinuxでも動くスクリプトの作成

busyboxがあればシェルと基本的なコマンドは手に入るから
あとは特定のアプリのWindowsバイナリ版を入れるだけで
WindowsでもLinuxでもMacでも使えるスクリプトが作れる

cygwinやmsysもあるけど、Windowsに標準搭載してほしい
最低限のことはできるようになる。

>>981
PowerShellはコマンド体型違うから
0988名無しさん@お腹いっぱい。
垢版 |
2018/08/01(水) 17:27:03.04
>>986
Windows標準でbusyboxとか採用してって話なのに
cygwinを持ち出されても、
 そんなのが必要になるから、Windows標準で採用してって言ってるんだよ
で終わる
0989名無しさん@お腹いっぱい。
垢版 |
2018/08/02(木) 01:46:48.23
>>988
SFU や WSL の流れからして、Busybox 相当の標準搭載も需要も無いと思いますよ。
必要ならば Sysinternals 等の TechNet フォーラムに参加して要望を出してみては。
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 90日 15時間 15分 29秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


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

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

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

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況