2ch勢いランキング アーカイブ

シェルスクリプト総合 その26 [無断転載禁止]©2ch.net


名無しさん@お腹いっぱい。 [sage] 2017/03/20(月) 12:07:26.41
シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
 FreeBSDユーザは/bin/shの正体がashなので注意。
 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
  ttp://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/
  ttp://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
 (理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
 「そういうのはperl使いましょう」と回答するのはやめましょう。
 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その25
ttp://echo.2ch.net/test/read.cgi/unix/1439563321/
名無しさん@お腹いっぱい。 [sage] 2017/03/20(月) 12:18:18.85
すまん、立てたはいいがセキュリティ違反か何かでテンプレが貼れない
誰か貼れないか
名無しさん@お腹いっぱい。 [sage] 2017/03/20(月) 12:24:45.46
ls -エル かな以前これで引っかかったことがある
ls -Rl とかなら通るんだけど
名無しさん@お腹いっぱい。 [sage] 2017/03/20(月) 14:13:27.13

> □お約束
> □初心者へのアドバイス:
> □回答者への注意事項:

□じゃなくて■にして欲しい
名無しさん@お腹いっぱい。 [sage] 2017/03/20(月) 15:00:21.27

それってなぜ?漢字のくちやカタカナのろと間違えやすいから?
名無しさん@お腹いっぱい。 [sage] 2017/03/20(月) 16:21:48.83

同じく書けなかった。テンプレ書こうとするとなぜかYou are blocked となる。
名無しさん@お腹いっぱい。 [sage] 2017/03/20(月) 17:09:06.18
前スレ立てられたの2年前みたいだし、その間に規約かその辺の変更でもあったかな
名無しさん@お腹いっぱい。 [sage] 2017/03/20(月) 17:32:38.34
シェルスクリプトの総合スレです。
初心者、学生、アマチュア、プロ、シェルの種類や OS を問いません。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずはテンプレートをご覧下さい。

□A. お約束
1. 特記なき場合は #!/bin/sh がデフォルトです。この場合可搬性に注意し、
 Traditional Bourne Shell もしくは、POSIX 相当のスクリプトでお願いします。
 bash / zsh / ksh / ash / dash や OS 等に依存する場合は、明示しましょう。
 良く分からない方は、使用している OS を書いておけば OK です。是非ご参加下さい。
2. 質問する前に、まず自分で調べましょう。ただし、
 「聞くは一時の恥、聞かぬは一生の恥」です。積極的に参加しましょう。
3. 相手を侮辱する発言、失礼な発言は差し控え、知的な議論を楽しみましょう。
4. 他者には様々な環境や事情、目的が有る事に留意し、無下に扱う様な発言は
 控えましょう。

□B. お約束の補足
1. Mac OS X では、/bin/sh の実体は bash です。また、一般的に BSD 系 や
 GNU/Linux の方は、/bin/sh がシンボリックリンクですので、注意して下さい。
 ls (ハイフン)l /bin/sh や readlink -e /bin/sh で確かめて下さい。
2. 可搬性については、下記 F.1 を参照して下さい。
3. POSIX については、man 7 standards や下記 F.2 ( の特に Shell & Utilities )
 を参照して下さい。
4. Traditional Bourne Shell とは、UNIX Version 7 から SVR4.2 の /bin/sh を元に
 小さなの改変を加え主に商用 UNIX で残されているものです。( 下記 F.3 参照 )
5. Traditional Bourne Shell で入手しやすい sh は、後期 SVR4.0 から派生し、
 SunOS 5 / OpenSolaris を経た、Heirloom Bourne Shell です。
 SVR4 / SVID3 相当です。同様の Unix utilities も扱っています。
 ( 下記 F.3 参照 )
名無しさん@お腹いっぱい。 [sage] 2017/03/20(月) 17:32:51.71
ls - lがだめなんですよ
名無しさん@お腹いっぱい。 [sage] 2017/03/20(月) 17:33:10.57
□C. 初心者へのアドバイス
1. シェルスクリプトのことをシェルってゆーな
2. 知らないコマンドが出てきたら man コマンドで調べましょう。
3. UNIX には、シェルスクリプトに便利な小さなコマンドが色々あります。
 apropos ないしは man -k でそれらしい単語による簡単な検索もできます。
4. シェルの構文や内部コマンドは man sh で。英語は LANG=C man shで。
5. 思い通りに動かないときは、まずは #!/bin/sh -x でトレースしましょう。
6. 適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 awk / perl / javascript / ruby / python 等、他の (スクリプト) 言語の方が
 適した処理にはそちらを使いましょう。
7. シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題は正規表現スレへ
8. csh / tcsh のシェルスクリプトは推奨されません。理由は下記を参照
 ttp://www.speech-lab.org/~hiroki/csh-whynot.euc
9. cat file|すんなハゲ
 a. 詳細は "Useless Use of Cat" UUOC で検索して下さい
 b. 有用な場合も有ります Useful use of cat(1) 英文
  ttp://www.in-ulm.de/~mascheck/various/uuoc/

□D. シェルスクリプトでよく使うコマンド
1. 制御・条件判定系: [, test, expr, true, false, yes, getopts
2. テキスト処理系: cat, awk, sed, tr, sort, uniq, grep, wc, head, tail, cut,
 paste, comm, join
3. ファイル検索系: find ( スペースなどを含むファイル名を正しく処理するため、
 find は -exec command {} + を推奨。
 他に -print0、xargs は -0 オプションという方法もあるが Solaris 非対応 )
4. ディレクトリ系: basename, dirname
5. 出力系: echo, printf
6. 対話コマンド制御系: expect
7. http / ftp の処理自動化: wget, curl
名無しさん@お腹いっぱい。 [sage] 2017/03/20(月) 17:33:34.08
□E. 学習用テキスト
1. Bourne Shell自習テキスト ( 1993年 ) pdf お薦め
 ttp://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/sh-text/sh/
 (↑サイト消滅かも)
 ttp://ayapin.film.s.dendai.ac.jp/~matuda/Lecture/PDF/sh-two.pdf
2. UNIX FAQ LIST
 ttp://www.nurs.or.jp/~asada/FAQ/UNIX/UNIX.FAQ.html
(3. シェルを使おう - 導入からプログラミングまで - ( 2002年 )
 ttp://www.netfort.gr.jp/~tomokuni/lms/shell/ (リンク切れ))

□F. 参考リンク
1. 可搬性関連
 a. autoconf マニュアル 移植性のあるシェルプログラム
  ttp://www.gnu.org/software/autoconf/manual/autoconf.html#Portable-Shell
  ttp://www.geocities.jp/fut_nis/html/autoconf-ja/Portable-Shell.html
 b. Portability talk [Bash Hackers Wiki] 英文
  Obsolete and deprecated syntax も見る価値有り
  ttp://wiki.bash-hackers.org/scripting/nonportable
 c. How to make bash scripts work in dash 英文
  ttp://mywiki.wooledge.org/Bashism
 d. DashAsBinSh 英文
  ttps://wiki.ubuntu.com/DashAsBinSh
 e. Portable Shell Programming 英文
  ttp://www.in-ulm.de/~mascheck/various/portability/
名無しさん@お腹いっぱい。 [sage] 2017/03/20(月) 17:33:47.61
2. POSIX
 The Open Group Base Specifications Issue 7 IEEE Std 1003.1, 2013 Edition 英文
 ttp://pubs.opengroup.org/onlinepubs/9699919799/
3. Traditional Bourne Shell 関連
 a. The Traditional Bourne Shell Family History and Development 英文
  ttp://www.in-ulm.de/~mascheck/bourne/
 b. BourneShell / Where does the Bourne shell live? 英文
  ttp://mywiki.wooledge.org/BourneShell
 c. The Heirloom Bourne Shell 英文
  ttp://heirloom.sourceforge.net/
4. マニュアル
 a. The Base Specifications Issue 7, 2013 Edition 英文
  ttp://pubs.opengroup.org/onlinepubs/9699919799/nfindex.html
 b. FreeBSD 日本語マニュアル検索
  ttp://www.jp.freebsd.org/man-jp/search.html
 c. JM Project (Japanese)
  ttp://linuxjm.sourceforge.jp/
5. FAQ 等
 a. UNIXの部屋 ( 2011年 )
  ttp://x68000.q-e-d.net/~68user/unix/
 b. Linux JF (Japanese FAQ) Project
  ttp://linuxjf.osdn.jp/
 c. Advanced Bash-Scripting Guide 英文
  ttp://www.tldp.org/LDP/abs/html/
 d. Unix Programming FAQ 日本語訳 ( 2000年 )
  ttp://www.race.u-tokyo.ac.jp/~moro/unix-programmer/
名無しさん@お腹いっぱい。 [sage] 2017/03/20(月) 17:34:01.41
6. ツール
 a. web tool です。Vim syntastic や Emacs の Flycheck でも使えます
  ShellCheck
  ttp://www.shellcheck.net/about.html
 b. vim 用 syntastic
  ttps://github.com/scrooloose/syntastic
 c. checkbashisms も使用してチェック duggan/shlint GitHub
  ttps://github.com/duggan/shlint

□G. 前スレ
1. ☆シェルスクリプトを勉強するにあたって☆
 ttp://hibari.2ch.net/test/read.cgi/unix/989659936/
2. 便利なシェルスクリプト見せろ
 ttp://pc.2ch.net/test/read.cgi/unix/996949546/
3. シェルスクリプト総合 その1
 ttp://pc5.2ch.net/test/read.cgi/unix/1101820646/
後略。検索して下さい
名無しさん@お腹いっぱい。 [sage] 2017/03/20(月) 17:34:15.91
□H. 関連スレ(UNIX板/プログラム板)
1. sed
 ttp://peace.2ch.net/test/read.cgi/unix/1085730992/
2. 正規表現
 ttp://peace.2ch.net/test/read.cgi/unix/1039165754/
3. Regular Expression(正規表現) Part13
 ttp://peace.2ch.net/test/read.cgi/tech/1415149975/
4.Perlについての質問箱 64箱目 [転載禁止](c)2ch.net
 ttp://peace.2ch.net/test/read.cgi/tech/1417291896/
5. ECMAScript デス 4
 ttp://peace.2ch.net/test/read.cgi/tech/1325448978/
6. Ruby 初心者スレッド Part 57©2ch.net [転載禁止](c)2ch.net
 ttp://peace.2ch.net/test/read.cgi/tech/1426165733/
7. Pythonのお勉強 Part50
 ttp://peace.2ch.net/test/read.cgi/tech/1413474092/
8. 【node.js】サーバサイドjavascript 3【io.js】(c)2ch.net
 ttp://peace.2ch.net/test/read.cgi/tech/1419673207/

□I. 現在評価待ち: X.n は予定した追加先。主にスレ立て人の判断保留用。
名無しさん@お腹いっぱい。 [sage] 2017/03/20(月) 17:38:33.53
なるほどサンクス、そこだけだったのね
名無しさん@お腹いっぱい。 [sage] 2017/03/20(月) 17:51:56.12
乙です

正規表現スレなんてものもあるのか
名無しさん@お腹いっぱい。 [sage] 2017/03/22(水) 02:44:38.59
bash内での関数の組み立て方を教えて下さい
jqのコマンドオプションを組み立てて実行したいのですが上手く行きません

function XXXX {
local filename=$1
local option="'.files | map(select(.name = \"$filename\" )) | .[0] '"
local st='echo' "\$files | jq $option"
$st
retrun 0
}

そもそもこんがらがってきているのでお助け下さい
名無しさん@お腹いっぱい。 [sage] 2017/03/22(水) 02:46:07.39
retrun になってる
他は知らん
名無しさん@お腹いっぱい。 [sage] 2017/03/22(水) 03:14:20.82

自己解決しました。jqの問題だったみたいです

function XXXX {
local filename=$1
local onefile
onefile=$(echo "$files" |jq―arg n "$filename" ".files | map(select(.name =\"\$n\" )) |.[0]")
以下省略
}
名無しさん@お腹いっぱい。 [sage] 2017/03/25(土) 09:35:56.16
最近標準エラー出力で引っかかったこと

pingで疎通が出来ないときにインタフェースを上げなおすスクリプト書いてた
pingでerror(パケットロス)が発生したときと

例:1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

インタフェースがダウンしてたとき

例:connect: Network is unreachable

一つ目は普通に実装できたけど二つ目がなぜか出来ない
コンソールで試してみたけどgrepにも引っかかってる

ように見えただけだった・・・

実はこれ標準エラー出力に出ててgrepに引っかかってるように見えたのはフェイクだった
結局以下のように「2>&1」を追加して標準エラー出力を標準出力に出すようにして解決した

例:ping x.x.x.x -c 10 2>&1 | grep "connect: Network is unreachable"
名無しさん@お腹いっぱい。 [sage] 2017/03/25(土) 10:19:05.39

なぜ出力を解析した?
実行結果を使うべきではなかったのか?
名無しさん@お腹いっぱい。 [sage] 2017/03/25(土) 10:25:44.42
一般にstdoutとstderrは用途が違うから(stderrはstdoutがリダイレクト
されても端末に出したいとか)、エラーテキストをgrepするような
ことをしたい場合は意識しないといけないね
ただ、pingコマンドの場合は終了コードを見るのが王道だと思う
名無しさん@お腹いっぱい。 [sage] 2017/03/25(土) 13:57:40.19

いまは$?見てる
元々は何パーセントかロスしてもいい造りにする予定だったんだ
最終的には正常0、ロスあり1、リンクダウン2だったので
0以外は問題ありって言う処理に修正した
名無しさん@お腹いっぱい。 [sage] 2017/03/25(土) 20:08:07.22
grepはcolor表示でマッチしてるか確かめればいい
名無しさん@お腹いっぱい。 [sage] 2017/03/26(日) 04:25:32.34
だいたい何かを作ってエラーが出てハマる時って、基本に立ち返って当たり前の事から検証し始めると解決するよね
大抵本当にアホな理由でつまづく
名無しさん@お腹いっぱい。 [sage] 2017/03/28(火) 06:24:43.37
一人で見てると、くだらないとこでハマったりよくあるな
一分でわからなければ二分探索する
名無しさん@お腹いっぱい。 [sage] 2017/03/28(火) 08:39:53.43
そして天下三分の計
名無しさん@お腹いっぱい。 [sage] 2017/03/28(火) 08:41:28.46
sakura四分割の術
名無しさん@お腹いっぱい。 [sage] 2017/03/28(火) 14:00:15.46
出会って五分でバグ出し
名無しさん@お腹いっぱい。 [sage] 2017/03/30(木) 17:29:20.60
簡単なマルチプロセスの方法ないか考えてたら
置換コマンドを変数で定義してやって、|でつなげてやればいいだけだった
名無しさん@お腹いっぱい。 [sage] 2017/03/30(木) 18:14:02.75
&でなく?
名無しさん@お腹いっぱい。 [sage] 2017/03/30(木) 18:30:02.88
&だと、サブシェルになるんで変数の取り出しが面倒
名無しさん@お腹いっぱい。 [] 2017/03/30(木) 21:12:06.15

マルチプロセスだろ?
名無しさん@お腹いっぱい。 [] 2017/03/31(金) 16:30:56.29
本报讯(记者黄辛)复旦大学药学院李聪团队和附属华山医院毛颖团队合作,
将一种新型纳米探针用于脑肿瘤手术导航,通过纳米探针对脑胶质瘤酸性环
境的响应性成像引导手术切除,有望为改善脑胶质瘤手术的预后提供一种新
策略。相关研究成果近日秋月康秀在线发表于《先进材料》。
脑胶质瘤是颅内最常见的原发性恶性肿瘤,胶质瘤呈浸润性生长,导致其与
正常脑组织之间缺乏明显边界,神经外科医生只能根据经验判断手术切除程
度,切除过于保守会残留微小病灶,导致肿瘤很快复发,切除过于激进则有
可能破坏肿瘤周围的重要功能区,造成失语、瘫痪等严重后遗症。
该研究发现了一种对肿瘤酸性环境具有双模态信号响应的探针,可用于引导
胶质瘤的手术切除。”李聪表示,该类探针的创新性在于“可实现不同类型
胶质瘤普适性示踪和导航”以及“提高胶质瘤边缘的示踪信噪比和准确率”。
ich1 [] 2017/04/01(土) 07:50:24.43
ttps://goo.gl/QoUujp
これは嫌だなー。。本当なの?
名無しさん@お腹いっぱい。 [sage] 2017/04/01(土) 13:12:08.71
どうせグロネタだろ
名無しさん@お腹いっぱい。 [sage] 2017/04/01(土) 13:29:34.75
とうせアフィ貼ってるスクリプトだろ
goo.glはURLの末尾に+つけるとリンク先が見れる
名無しさん@お腹いっぱい。 [sage] 2017/04/01(土) 14:55:47.20
短縮URLは完全スルーだしNGワードにしようと思えばできるし
コメントもスパム丸出しだから問題ない
名無しさん@お腹いっぱい。 [] 2017/04/01(土) 22:25:57.55
シェルスクリプト用のトランスパイラとか
ビルドツールってないですかね?

JavaScriptの世界であるような、それらがあれば
POSIX標準のままシェルスクリプトという言語仕様を
拡張できるのですが
名無しさん@お腹いっぱい。 [sage] 2017/04/02(日) 13:32:05.83
前スレにsedで改行を扱う方法があったんでいろいろ遊んでたら、
分かったつもりでいた挙動がわからなくなってしまった

おk
echo -e "abc\ndef" | sed 'N;s/\ndef/def/g'
echo -e "abc\ndef\nghi\njkl" | sed 'N;s/\ndef/def/g'

ダメ
echo -e "abc\ndef\nghi" | sed 'N;s/\ndef/def/g'
echo -e "abc\ndef\nghi\njkl\nmno" | sed 'N;s/\nghi/ghi/g'

なんで、下二つは最後の行が表示されないの?
しかもダメの下は置換もされないのは、なぜ?
名無しさん@お腹いっぱい。 [sage] 2017/04/02(日) 18:49:19.32
GNU sed 4.4 だとダメ2つとも最後の行が表示されるなぁ。

同じく GNU sed 4.4 だと、

echo -e "abc\ndef\nghi" | sed 'N;s/\ndef/def/g'
=>
abcdef
ghi

となって置換されるけど、

echo -e "abc\ndef\nghi\njkl\nmno" | sed 'N;s/\nghi/ghi/g'

は置換されない。これは ghi が3行目にあるから(偶数行目にあれば問題ない)。
まぁ、やるとしたらこんな感じになると思う(意味のない処理だけど)

echo -e "abc\ndef\nghi\njkl\nmno" | sed ':a;N;$!ba;s/\nghi/ghi/'
名無しさん@お腹いっぱい。 [sage] 2017/04/03(月) 12:09:41.36
echo -eはなんか厄介
他のディストリに持ってったら動き(表示だけど)が違った
名無しさん@お腹いっぱい。 [sage] 2017/04/03(月) 12:50:52.83
-e が使えない場合もあるので printf で
名無しさん@お腹いっぱい。 [] 2017/04/03(月) 19:25:53.89

そういうの書くな。
バグの温床だ。
名無しさん@お腹いっぱい。 [] 2017/04/03(月) 19:26:37.45
OSによって挙動が異なるかもしれないので危険。
名無しさん@お腹いっぱい。 [sage] 2017/04/03(月) 19:34:32.62
だから意味がないって書いたやん
名無しさん@お腹いっぱい。 [] 2017/04/03(月) 23:27:26.85
unixプログラミング環境って本の問題に、

1「cat hoge.txt fuga.txt >hoge.txt」

2「cat hoge.txt >>hoge.txt」

ってやるとどうなるか考えろってのがある。

実行すると、

1「hoge.txtがfuga.txtの内容で上書きされる」

2「hoge.txtの内容が無限にコピペされる」

となったんだが、どうしてこうなるのか誰か知ってたら教えて!
名無しさん@お腹いっぱい。 [sage] 2017/04/03(月) 23:41:45.44
ファイルですくりぷた
のうごきをかんがえよう
名無しさん@お腹いっぱい。 [sage] 2017/04/04(火) 00:57:45.30

考えたらわかったけど、知らなかったから教えない
名無しさん@お腹いっぱい。 [sage] 2017/04/04(火) 01:03:26.09
へんくつなやつしかいねー
名無しさん@お腹いっぱい。 [sage] 2017/04/04(火) 01:11:40.09
シェルとcatがそうなるような実装になってるんだろう
わりと自然な結果だと思う
名無しさん@お腹いっぱい。 [sage] 2017/04/04(火) 11:29:13.28
知らんけど推測で。

1-a. シェルが hoge.txt を O_WRONLY(?) | O_TRUNC とかでオープン (O_TRUNC なので 0バイトになる)
1-b. シェルが cat hoge.txt fuga.txt を exec
1-c. cat が hoge.txt をオープンするも、0バイトなので実質何もしない。
1-d. cat が fuga.txt をオープンして標準出力に出力。

2-a. シェルが hoge.txt を O_WRONLY(?) | O_APPEND でオープン。
2-b. cat が hoge.txt をオープンし、読み込んだものを標準出力に出力。
2-c. 読み込むと、直前に書いたものが読み込めてしまうので永遠に終わらない。

2の挙動は知らんかったなぁ。
名無しさん@お腹いっぱい。 [sage] 2017/04/04(火) 12:04:17.27
2 の場合、bash, dash, ksh だと input file is output file って表示される
bash では noclobber を unset にしても同じ
名無しさん@お腹いっぱい。 [sage] 2017/04/04(火) 12:11:59.45

それはcatの引数が入力ファイルだと言う知識をshellがもってるという事だね
気持ち悪い
名無しさん@お腹いっぱい。 [sage] 2017/04/04(火) 12:16:42.64
これは無限ループにもエラーにもならない

$ cat hoge.txt | cat >> hoge.txt

しかし、ファイルサイズがパイプやプロセスのバッファサイズを
超えるとどうなるか…こんな場合は moreutils の sponge コマンドかな
名無しさん@お腹いっぱい。 [sage] 2017/04/04(火) 12:40:17.25
Cで言う未定義なみたいなもので、どういう結果になろうが客観的な意味は無い
名無しさん@お腹いっぱい。 [sage] 2017/04/04(火) 14:59:59.10
はシェルではなくGNUのcatの実装

% echo a >a
% cat a >>a
cat: a: input file is output file
%

gitリポジトリ上で参照できる一番古いログ(1992年)の時点で既にある
ttps://git.savannah.gnu.org/cgit/coreutils.git/tree/src/cat.c?id=b25038ce#n267
名無しさん@お腹いっぱい。 [sage] 2017/04/04(火) 16:51:55.21

ありがとう、GNU cat だからなのね
名無しさん@お腹いっぱい。 [] 2017/04/13(木) 16:40:20.18
sqlplusでselect文を実行したときにレコードが該当しない場合の値って何が返されるの?
予想だと""なんだけど
名無しさん@お腹いっぱい。 [sage] 2017/04/13(木) 17:33:03.18

俺は SELECT 結果の行数をカウントして判定してる。

ちなみにシェルスクリプトで sqlplus をカプセル化しようとすると、SQL 実行時のエラーチェックが地味に面倒だよね。
頑張ってね。
名無しさん@お腹いっぱい。 [] 2017/04/13(木) 17:57:28.60

count(0)ですねわかります
シェルスクリプトってsqlで取ってきた値がnullのときその値を変数に格納したらどうなんの?
そもそもselect文で該当なしでエラーになるのかもわからん
名無しさん@お腹いっぱい。 [] 2017/04/13(木) 18:02:46.69
なんでこんなこと聞くのって思うだろうけどprintfで書式指定するときにnullが変えるかもしれない変数を%08d$nで指定してるんだよね
文字列指定してけば良かったんだけど、これって修正必要かなぁ
名無しさん@お腹いっぱい。 [sage] 2017/04/13(木) 18:51:39.93

違う違う。SPOOL で SELECT 結果をファイルに保存し、そのファイルの行数を wc -l でカウントするイメージです。
いろいろとやり方があると思うけど、私の場合は項目区切りを TAB でレコード区切りを改行にして SELECT 結果を TSV ファイル化することが多い。
んで、そのファイルをシェルで一行ずつ読み込みながら必要に応じて処理する感じ。awk で各項目の値をバラすのがラクチン。

NULL 値は、フツーに処理してれば特に意識してなくても空文字列としてシェルスクリプトの変数に入るはず。

あと SELECT COUNT(*) を実行するケースも無いではないけど、その結果が 0 でない場合はもう一度 SELECT するってこと?
クエリを二度実行するコストは容認できないケースが多いと思います。
もちろん、SELECT 結果の有無のみが必要なケースなら SELECT COUNT(*) した結果が 0 かどうかで判定するのはアリです。


もうちょっと具体的に説明してもらわないと分からないけど、例えば SELECT name FROM emp WHERE id=1; の結果が NULL だと困るのなら……
実行するクエリを SELECT NVL(name, '(NULLだよ)') FROM emp WHERE id=1; みたいに変更すればいいだけじゃね?
名無しさん@お腹いっぱい。 [sage] 2017/04/13(木) 19:01:35.58
確かに一度ファイルに落としてからawkとかに食わせる方が何かと楽そうだな
名無しさん@お腹いっぱい。 [] 2017/04/14(金) 18:54:35.33
澁谷 恭正 (46歳)

千葉県立沼南高柳高等学校卒

松戸市立六実第二小学校PTA会長

小学女子レイプ殺人で逮捕


お住まい:
千葉県松戸市六実4-8-1 Mシャトレ

お子さん:
ひりゅう、あやか ※父子家庭

趣味傾向:
アニオタ
名無しさん@お腹いっぱい。 [] 2017/04/14(金) 18:55:56.71
SQL*Plus、PL/SQLに詳しくないからそういう発想になるのはわかるが、普通にやれよ。
名無しさん@お腹いっぱい。 [] 2017/04/15(土) 15:48:43.00

普通ってやんだよw
名無しさん@お腹いっぱい。 [] 2017/04/15(土) 17:42:26.47
シェルとsqlplus触ったの1,2ヶ月だけど、半年後にはおまえ超えてるから
名無しさん@お腹いっぱい。 [] 2017/04/15(土) 17:43:22.15
シェルなんてゴミ言語勉強するほどでもないけどなw
名無しさん@お腹いっぱい。 [] 2017/04/15(土) 18:11:52.36
クエリを2度実行するコストよりもってあるけど、コストそんなかからないし、どっちでもよくね。
sqlじたいそんな詳しくなくてすまんな
名無しさん@お腹いっぱい。 [] 2017/04/15(土) 18:15:32.21
ワンステップでどんだけコストかかる現場にいたのか
名無しさん@お腹いっぱい。 [] 2017/04/15(土) 18:43:16.43
ttp://d.hatena.ne.jp/ttduck/touch/20080425/1209339164
同じ事考えてる人がいたのかな、sqlなんてデータを引っ張ってくる手段でしかないからテキトーだったけど
名無しさん@お腹いっぱい。 [] 2017/04/15(土) 18:53:59.01
これはステップ数大きいけど、たしかおれは2ステップで書いた
名無しさん@お腹いっぱい。 [] 2017/04/16(日) 03:11:26.19

なんで例外処理でやらないのか?
基本中の基本だぞ。
名無しさん@お腹いっぱい。 [] 2017/04/16(日) 13:19:14.99

だからやってるって話だよ
バカなの
名無しさん@お腹いっぱい。 [] 2017/04/16(日) 13:20:30.64
シェルでカプセル化とかもわけわからんし、このスレわからんわ
名無しさん@お腹いっぱい。 [sage] 2017/04/17(月) 12:57:10.19
実行ファイルが実はシェルスクリプトだった、なんてことは/usr/binによくあること
名無しさん@お腹いっぱい。 [sage] 2017/04/17(月) 16:49:07.58
$ for d in /bin /usr/bin /sbin /usr/sbin ; do echo -n "$d: " ; file $d/* | fgrep 'shell script' | wc -l; done
/bin: 25
/usr/bin: 290
/sbin: 12
/usr/sbin: 57
意外とあるな
名無しさん@お腹いっぱい。 [sage] 2017/04/18(火) 05:15:59.66
historyから所定のコマンドだけ削除するシェルスクリプトってあったりする?
名無しさん@お腹いっぱい。 [sage] 2017/04/18(火) 14:18:08.94

history
名無しさん@お腹いっぱい。 [sage] 2017/04/18(火) 17:45:32.71

ほほう -d オプションというものがあるのか……と思ったんだけど、これって bash のみだったりする?
手元の古い tcsh には無いみたい。それとも最近のシェルなら普通に実装されてるのかな。
名無しさん@お腹いっぱい。 [sage] 2017/04/18(火) 18:10:08.46
bash限定
名無しさん@お腹いっぱい。 [] 2017/04/19(水) 12:00:20.42

こういうのって、fgrepにIをつけたほうがいいのかな。
名無しさん@お腹いっぱい。 [sage] 2017/04/19(水) 12:04:12.58
file コマンドの結果だから要らないんじゃない
名無しさん@お腹いっぱい。 [] 2017/04/19(水) 12:41:43.72

ありがとうございます
昔、binの中等気をつけろと言われた事があったので勘違いしてました
名無しさん@お腹いっぱい。 [] 2017/04/19(水) 16:28:25.43

なんでexceptionでno_data_foundを拾わないのか?

カウントしてしまうのは、不慣れなひとがよくやるけど。
ich1 [] 2017/04/20(木) 18:27:26.09
ttps://goo.gl/fSbVMj
これは嘘でしょ?本当だと嫌だなー。。
名無しさん@お腹いっぱい。 [sage] 2017/04/20(木) 19:20:34.53
2chで短縮とか
名無しさん@お腹いっぱい。 [sage] 2017/04/20(木) 19:22:58.55
それただのマルチだよ
名無しさん@お腹いっぱい。 [sage] 2017/04/20(木) 21:07:15.56
マルチどころかスクリプトですから
名無しさん@お腹いっぱい。 [] 2017/04/21(金) 17:16:08.95

え?
名無しさん@お腹いっぱい。 [] 2017/04/21(金) 18:35:17.79
この中で過去にシェルを仕事でやってたって人何人くらいいるのかな
名無しさん@お腹いっぱい。 [sage] 2017/04/21(金) 21:31:36.96
自分はインフラ関連やってたよ
今は仕事ではコンソール触ることはなくなったけど
家で動画ダウンロード用のスクリプト組んだりしてる
名無しさん@お腹いっぱい。 [sage] 2017/04/21(金) 21:34:59.83
ちなみに性能情報の収集や監視スクリプト、
バックアップとかの運用シェル作ってたけど
可読性も考えてオーソドックスなプログラミングのような書き方をしてたから
超何かよく分からん使い方をしてるココの人の方がシェルスクリプト知ってると思う
名無しさん@お腹いっぱい。 [] 2017/04/22(土) 04:52:18.92

よくわからない書き方してるほうが上手いとも言えないでしょ
名無しさん@お腹いっぱい。 [] 2017/04/22(土) 04:53:18.13
linuxってちゃんと使いこなせれば快適だよなすごいわかる
名無しさん@お腹いっぱい。 [sage] 2017/04/22(土) 05:55:28.79

shだけの仕事は数えるほどしかないけど
他の仕事の小道具として毎回のように出てくるな
javaとかwindows系の仕事だと使えなくてめんどくさい
開発ツールとしては使うけど
名無しさん@お腹いっぱい。 [sage] 2017/04/22(土) 17:13:19.84
仕事でシェルスクリプト書くなんて
めずらしくもなんともないよ
名無しさん@お腹いっぱい。 [] 2017/04/22(土) 19:43:27.62

めずらしいとは思ってないけどさ、働いてないのかと思った。
何かしら経験ある人もいるのな、仕事で使ってて家でもシェルいじろうとかよく思えるな
名無しさん@お腹いっぱい。 [sage] 2017/04/23(日) 19:09:14.57

手間とかを省くために使うからプライベートだろうと使うだろう
その発想は使わされてる人のものだと思うぞ
名無しさん@お腹いっぱい。 [sage] 2017/04/23(日) 22:45:17.52
仕事か家かどっちかでしか使っちゃダメなの?
便利なんだからいろんなとこで使ってもいいじゃん
名無しさん@お腹いっぱい。 [sage] 2017/04/24(月) 15:09:28.61

俺は職場から2ちゃんに書き込んでるだけだよ。
名無しさん@お腹いっぱい。 [sage] 2017/04/24(月) 16:00:30.29
学生でもなくて働いたことも無いならシェルいじろうとは思わないでしょ
名無しさん@お腹いっぱい。 [] 2017/04/24(月) 16:02:53.74
他紙蟹
わかったからそんなせめんなよごめんなっっ
家でシェル使ってる人ってwindows機は別にあるの?
名無しさん@お腹いっぱい。 [] 2017/04/24(月) 17:31:59.58
あるよ、自分はWindowsなんて使わないという偏屈ではないしさ
Linuxの実機はラズパイだけであとは仮想環境
まあ他にも色々あるけど実際に使ってる環境ってことならね
を書いたのは嫌気がさして書いたんじゃなくて
目的や知識がないとシェルなんて触る機会もないでしょって意味で書いた
名無しさん@お腹いっぱい。 [] 2017/04/24(月) 17:49:44.72
ubuntu on the windowsのおまえらの率直な感想が聞きたい
名無しさん@お腹いっぱい。 [sage] 2017/04/24(月) 19:04:22.14
【Bash】Windows Subsystem for Linux【Ubuntu】2©2ch.net
ttp://hayabusa6.2ch.net/test/read.cgi/linux/1468149353/
名無しさん@お腹いっぱい。 [sage] 2017/04/24(月) 20:27:56.84

便利なもんなんだから使うだろう
知ってて環境あって使いどころあれば
名無しさん@お腹いっぱい。 [sage] 2017/04/24(月) 20:34:34.47

windows持ってないです
名無しさん@お腹いっぱい。 [sage] 2017/04/24(月) 22:40:54.70

そんな向上心があるなら学ぶか働いてるでしょ
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 00:10:36.87

そういう学科の学生かそういう業務の仕事でなくても使う人は使うってことじゃないの
名無しさん@お腹いっぱい。 [] 2017/04/25(火) 00:43:15.05

やるじゃんそーゆー振り切ってる感じ好きだぜ
名無しさん@お腹いっぱい。 [] 2017/04/25(火) 00:49:06.70

そうは言ってなかったな、シェルなんて職場で使わなきゃやろうと思わないでしょって言ってたよ
名無しさん@お腹いっぱい。 [] 2017/04/25(火) 00:51:05.94
ぶっちゃけLinuxだけだと不便やねん、だからどっちもいるねん、必須なのはWindowsやねん、結局便利だけどLinuxは無くてもいけるねん
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 00:57:32.66
実際Windowsないと公私共に不便だろって思う
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 01:15:23.26

仕事も勉強も関係なくエロ画像収集に使うだろ
初めてはSSIとかCGIだったな
ISPでシェルアカウント付きのとこもあった
やらされてるだけの人には価値はわからんだろうけど
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 01:19:30.55
Windowsなくても別に困らないなあ
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 05:48:06.67

VBとかで出来るからね
シェルを使うにはUnix環境が必要で
知識ゼロのニートが自主的にやったってのは知らないなあ
Unix界隈に居る人って性格悪いじゃん?
そんな中で続くとは思えないんだけど

学生か働いてる(働いてた)時に得た知識でやるならわかるけどさ
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 06:14:57.29
画像収集ツールって昔からいくつかあるけど
それを使わずにシェルスクリプト使った人が今何してるのか興味あるな

自分はOSもアプリも言語も道具だから何でもいいんだけど
獲得したものを特別なものと思って他人を見下すってのは余裕のない感じがするね
そのあたりがLinuxが流行らなかった理由なんじゃないかと思う
スマホ使ってる人なんてニコニコしながら嫌味無く教えてくれるときあるしw
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 06:32:05.73
やらされてるだけの人って嫌味なんだろうけど
ココで答えてくれてる人はそんな人なこと忘れてるよ
失礼な奴だな
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 09:39:07.19
シェルスクリプトを作れない人がやっかんでるだけに見えるな

画像収集ツールみたいなことをする場合、Windowsアプリも
cygwonでシェルスクリプト+コマンドのパターンも使う
一方しか出来ない人は時間を損してると思うよ
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 09:44:08.16
暇つぶしに聞いただけだろう
現役で職場でシェルスクリプト使う身からすると奇妙な質問には思えるが
これがCOBOLとかなら話分かったけど
名無しさん@お腹いっぱい。 [] 2017/04/25(火) 10:09:42.40

Unix界隈の人は性格悪いってま?
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 10:21:07.46
どこかのスレで質問してみれば分かるよ
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 10:29:48.93
画像収集ツールってWindowsで動く既存アプリがいくつもあるんだよ〜
自分はシェルスクリプトを否定はしていない

でも学んでも働いても無かった人(要するにシェルを使ってなかった人)が
画像収集するためにいきなりシェルを使うとは思えないんだな
シェルスクリプトに行き着くためには
UnixなりりLinuxなりCygwin、BoW、Services for UNIXが必要になるわけであって
画像収集するのに便利って言うのは違和感がある
そういう人が本当に使ってるとして今どのレベルなのかも興味があるね

まだ画像収集レベルなのかな?

まあ別に目的を達せられたら良いんだけどね(で振り出しに戻ると)
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 10:31:54.24
ちなみに自分は学んだし仕事でやってたよ
だから実装は楽だしやらせたいことを自動でやらせるためにスクリプト組んでるね
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 10:40:20.49
すまん、結局何が言いたいのか分からん
これは単にシェルスクリプト使ってるのを見下したいだけなのか?
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 10:46:20.83
自分が使える道具を、使うと何かの目的が達せられるところで使うだけだよ
環境、能力、目的は人によるから想像力の欠如をアピールしてもしょうがない
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 11:20:26.09

CGIやSSIやISPはweb関連だ
wwwの世界はUnixばかりだからな
で何もなかった昔のwwwではCGIの設置改造とか普通
どうやって動いてるのかとか興味を持って調べた奴も多いだろう
つまり趣味で知った奴もいるってことだ

昔はWindowsでもcygwinとかでシェル使ってたけどな
今はないのかな
VBのツールのメンテとかもしてたけどUnixが吐くデータの処理だったからshで置き換えて効率化したな

やらされてる奴に性格悪い奴がいることはわかった
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 14:29:24.94

お前こそ金にならないことやらされてるじゃん
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 14:33:19.26
やらされてる連呼クンに触るなよ
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 14:38:02.51
なんつうか、こんな話題で長文して結論がそれって
よほど嫌なことあって愚痴りたかったんだろうな
名無しさん@お腹いっぱい。 [] 2017/04/25(火) 14:42:58.20

ラズパイってむずい?
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 15:04:06.17

今仕事何やってるの?
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 15:04:11.72

VBのツールの置き換えは仕事だぞ
趣味はお金払ってでもするものだけどな
ただUnixワークステーションとか買えねえよ
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 15:05:57.55

開発
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 15:32:19.24
なんだ結局仕事にしたんじゃん
素人でまだ触ってるかと思った
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 16:43:11.74
やらされに成り下がっててワロタ
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 17:46:11.39

シェルスクリプトで開発の仕事なんて滅多にないよ
お前は無職?
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 17:53:41.95
いやなんで煽るんだよ
お前何しにこのスレ来たんだよ
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 17:53:50.03
開発経験者が趣味でシェルスクリプト書くって普通だと思う
てっきり営業とか企画とか別分野の人がシェルスクリプト書いたのかと思った
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 18:09:20.39
なぜ普通以外だと予想したのか
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 19:25:03.65
俺もまったくの異業種の奴が言ってるのかと思ったよ
とか見るとね
ニートがエロパワーで頑張ったのかと思ったw
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 19:42:41.24
アスペか
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 20:48:36.96
ハードウェア開発だったからまったくの独学だけどな
名無しさん@お腹いっぱい。 [sage] 2017/04/25(火) 22:28:49.44
バージョン管理とかするだろうし環境作りでUnix使うだろ
どこまで無学なんだよ
名無しさん@お腹いっぱい。 [sage] 2017/04/26(水) 00:06:14.19
ワークステーションとか商用Unix知らないのか無学だな
名無しさん@お腹いっぱい。 [sage] 2017/04/26(水) 01:01:14.37
くだらない話題で申し訳ないんすけど
シェルスクリプトで使う変数の規則とかってどう決めてます?
自分は_HOGEがいいかなって思ってるんですけど、マジョリティはどうかなと(ここがマジョリティかどうかは別だけど)
名無しさん@お腹いっぱい。 [sage] 2017/04/26(水) 01:38:09.14

変数はhoge、環境変数はHOGE
名無しさん@お腹いっぱい。 [sage] 2017/04/26(水) 08:25:15.17

とくに名前に規則は設けず、関数内で local 宣言でできるだけ隔離。
気にはなるけど、個人的には実際に問題になったことが無いし、export しなければ大丈夫じゃないか?
名無しさん@お腹いっぱい。 [] 2017/04/26(水) 08:45:28.91

シェル内に影響するよ
スクリプトならシェルスクリプト内までその変数が生きる
名無しさん@お腹いっぱい。 [sage] 2017/04/26(水) 08:52:37.57
localって業務用なら使うべきなんだろうがいまいち慣れないんだよなぁ
スコープ分けは基本ってのは分かっちゃいるんだがシェルスクリプトはどうもlocal使ったら負けな気がする
すげぇどうでもいいんだけどな
名無しさん@お腹いっぱい。 [sage] 2017/04/27(木) 01:52:59.43

俺はと同じ
↓を一度読んどくと良いと思う
ttps://www.gnu.org/software/autoconf/manual/autoconf.html#Special-Shell-Variables
名無しさん@お腹いっぱい。 [] 2017/04/27(木) 08:52:30.15
おまえらただのニートじゃなさそうだな
名無しさん@お腹いっぱい。 [sage] 2017/04/27(木) 08:55:21.07
お前は何を言ってるんだ
名無しさん@お腹いっぱい。 [] 2017/04/27(木) 08:59:38.21

ジョークだろなんでそんなにおこる?
名無しさん@お腹いっぱい。 [sage] 2017/04/27(木) 09:01:08.43

俺にしたって某画像のネタをそのまま貼っつけただけで別に怒っちゃいないぞ
名無しさん@お腹いっぱい。 [] 2017/04/27(木) 09:25:43.77

こりゃ一本取られたな
名無しさん@お腹いっぱい。 [sage] 2017/05/06(土) 16:52:42.42
echo "${hoge[@]}" | xargs -P 10 -n 1 -J{} echo {} >> test.txt
てやると、期待するファイル内容は
aaa
bbb
ccc
...
なのに
aaa
bbccc
...
となってしまいます。
これを回避するいい方法ないですか?
名無しさん@お腹いっぱい。 [sage] 2017/05/06(土) 18:13:00.72
hogeの中身はどうなってんの?
名無しさん@お腹いっぱい。 [sage] 2017/05/06(土) 19:56:59.36
Debian GNU/Linuxでのbashなのですが、指定時間指定ユーザのログインが無ければ
シャットダウンするシェルスクリプト
ttps://pastebin.com/pJ3v4TYY
を勉強を兼ねて作ってみました。
正常に動作していますが、何か変なところありますか?
名無しさん@お腹いっぱい。 [sage] 2017/05/06(土) 21:11:07.00
cronでやってそうだけど
ログインしてたらループ抜けないようになってるから
1日経つと重複起動すると思う

あと指定時刻なのか一定時間なのかはっきりした方がいい

動いてると思ってるならいいんでないの
名無しさん@お腹いっぱい。 [sage] 2017/05/06(土) 21:31:34.54

一定時間です。

/etc/rc.localってcronで1日ごとに起動されるのでしょうか。
PC電源投入後Linux起動時にただ一度だけ実行されると思っているのですが
名無しさん@お腹いっぱい。 [sage] 2017/05/06(土) 22:28:29.89
シェルの前に日本語を学んだ方がいい
名無しさん@お腹いっぱい。 [sage] 2017/05/06(土) 23:44:25.36

常駐しないでlastとかでログインしなくなってから何分経ったか毎回計算した方がシンプルじゃない
なんだっけvarの下になんかあったよね
名無しさん@お腹いっぱい。 [sage] 2017/05/06(土) 23:53:03.17

それだと、PC起動直後(lastとかで経過時間計算直後)にシャットダウンが走る可能性があるような
名無しさん@お腹いっぱい。 [sage] 2017/05/07(日) 01:18:18.46

仕様通りだな
名無しさん@お腹いっぱい。 [sage] 2017/05/07(日) 03:40:10.15

ダメってわけじゃないけど、"$1"と比較するなら grep は要らないはず(12行目)


一度だけ起動であってる
重複起動とか言ってる人は無知か勘違いなので無視していい


varの下のなんかってwtmpのこと?
wtmpは確実に更新されるわけじゃないし時間の計算も面倒になるので
の方がシンプルだろうね
名無しさん@お腹いっぱい。 [sage] 2017/05/07(日) 04:01:11.02

確かに仕様通りだね
PC起動してlogin受け付ける前にpoweroffしてしまうようになるだろうけど
名無しさん@お腹いっぱい。 [sage] 2017/05/07(日) 08:46:28.77
一定時刻ログインしてないんだから当たり前
名無しさん@お腹いっぱい。 [sage] 2017/05/07(日) 10:22:50.37
15分でシャットダウンって考えられない
まあ習作だからいいんだろうが
名無しさん@お腹いっぱい。 [] 2017/05/07(日) 16:02:10.86

チャージマン研!第23話「恐怖!精神病院」
ttps://youtu.be/ckO9d_-qiPw
名無しさん@お腹いっぱい。 [sage] 2017/05/07(日) 21:37:10.56

そこは運用で調整してけばいい話だろう
161 [sage] 2017/05/07(日) 22:15:23.57
みなさんありがとう。


> "$1"と比較するなら grep は要らないはず(12行目)
他ユーザがログインしていても無視してシャットダウンする仕様にしたいのです。
> 一度だけ起動であってる
了解


> 15分でシャットダウンって考えられない
トイレとかの時、5分ほどかかる自分環境自動バックアップの処理を走らせ
画面ロックして席を立ちます。
席に戻ったらまた作業に戻るのですが、とっさの用事で席に戻れない時は
電源が切れていて欲しいのです。
10分だと下痢の時短いかも。20分もいらない。だから15分。

画面ロック(ログイン状態)の時に電源切断するのは気持ち悪いので
ログオフ状態の時に切れるようにしたいのです。
(そのため、バックアップ処理完了後は自動でログオフされるようにしています)

ちなみにWindowsではそういう自作ServiceをCで書いて走らせています。
Linuxは簡単ですね。
名無しさん@お腹いっぱい。 [sage] 2017/05/08(月) 01:49:41.10
タイムカードの無い現場で ふらっと早退してやろうって感じなのかね
名無しさん@お腹いっぱい。 [sage] 2017/05/08(月) 05:13:08.30
そんなんならサスペンドでいいじゃん
久しくシャットダウンしてないや
名無しさん@お腹いっぱい。 [sage] 2017/05/08(月) 07:30:05.34
Windows簡単だと思うけどな
Cならコンパイルとかの環境が必要だけど所詮慣れだし
Cなんか使わずにVBScript使えばいいんじゃないの
名無しさん@お腹いっぱい。 [sage] 2017/05/08(月) 09:48:57.03
Windowsは簡単だな諦めるしかすることないから
名無しさん@お腹いっぱい。 [sage] 2017/05/08(月) 19:53:34.22

Windowsだと、Cでservice作る以外にを実現する方法ってあるのかな
名無しさん@お腹いっぱい。 [sage] 2017/05/08(月) 21:53:34.64
Windowsできるアピールはいらん
ほかでやれ
名無しさん@お腹いっぱい。 [sage] 2017/05/09(火) 20:02:44.75
そう、マッキントッシュならね
名無しさん@お腹いっぱい。 [sage] 2017/05/15(月) 06:37:29.43
時間のかかるパイプライン処理中に現在の中間処理内容を
メッセージ表示させることはできませんか?
echo で標準出力に表示させようとしてもそれは次のパイプラインに渡って画面に表示されませんよね?
標準エラー出力で表示させるしかないでしょうか?
名無しさん@お腹いっぱい。 [] 2017/05/15(月) 07:04:43.49
tee
名無しさん@お腹いっぱい。 [sage] 2017/05/15(月) 11:20:57.06
このスレの無駄のなさすぎる回答好き
名無しさん@お腹いっぱい。 [sage] 2017/05/15(月) 21:05:16.62
そう、マッキントッシュならね
名無しさん@お腹いっぱい。 [sage] 2017/05/15(月) 23:50:07.04
でもteeの仕様って、一方をファイルじゃなく、stderrあたりに
しておいてくれれば、もっと汎用性上がったのにね
名無しさん@お腹いっぱい。 [sage] 2017/05/16(火) 00:37:43.04
UNIXでは標準エラーもファイルだから問題ない
名無しさん@お腹いっぱい。 [sage] 2017/05/16(火) 06:24:05.92
teeの出力先をstderrにすると、中間処理をモニタすることしかできなくなるのでは?
ファイルに書けばモニタも出来るし汎用的
名無しさん@お腹いっぱい。 [sage] 2017/05/16(火) 07:42:47.01
>186
デフォルトでstderrに吐くと、teeのエラーを吐く場所がなくなるからでは? (例えば ls | tee --wrongoption とかの場合)
モニタしたければ tee /dev/stderr でよい。
名無しさん@お腹いっぱい。 [sage] 2017/05/16(火) 08:32:03.95

dev使うのはOS依存じゃね?
名無しさん@お腹いっぱい。 [sage] 2017/05/16(火) 10:02:35.57

stderrもリダイレクトできるよ
名無しさん@お腹いっぱい。 [] 2017/05/19(金) 20:34:10.11
シェルってオブジェクト指向で書けないの?
暗黙的ルール多すぎだろ
名無しさん@お腹いっぱい。 [sage] 2017/05/19(金) 22:16:49.58

>> 暗黙的ルール多すぎだろ
例えば?
名無しさん@お腹いっぱい。 [sage] 2017/05/19(金) 23:31:44.94

OOPの本質を理解してれば出来る
もし出来ないなら個人の能力に問題がある
名無しさん@お腹いっぱい。 [] 2017/05/20(土) 03:14:17.14
シェルはパイプで渡していくと
関数型っぽいけど
名無しさん@お腹いっぱい。 [sage] 2017/05/20(土) 09:42:17.19
関数型と見るかメソッドチェーンと見るかの違いだな。
名無しさん@お腹いっぱい。 [sage] 2017/05/20(土) 21:59:01.54

ttps://invent.life/project/bash-infinity-framework
名無しさん@お腹いっぱい。 [sage] 2017/05/20(土) 22:19:56.29

オブジェクト指向で書くと暗黙のルールがなくなるの?
名無しさん@お腹いっぱい。 [sage] 2017/05/21(日) 05:34:32.67

別にシェルが嫌なら同じ処理をプログラミング言語で作れば良いじゃ無い。
LLならそんな手間じゃ無いし。
名無しさん@お腹いっぱい。 [sage] 2017/05/21(日) 18:05:12.85
はシェルの開発言語のことを聞いてるんだよね?
確かに、たいていのシェルはCで書かれてるし
名無しさん@お腹いっぱい。 [sage] 2017/05/21(日) 19:34:04.56
だんだん分けわからなくなってきたわ
名無しさん@お腹いっぱい。 [sage] 2017/05/23(火) 14:55:53.34
$ls>hoge.txt
だとカレントディレクトリのリストができますけど、
さらに深堀りして、そこにあるフォルダ(ディレクトリの中身)も表示させるには
どうすればいいのでしょうか?

それから、
フォルダかファイルの名前 ディレクトリ名(/Users/namae/nanntyaca/hogehoge.txt)
のようなふうに二つを並べて吐き出させたいのですがどうすればいいでしょうか?
名無しさん@お腹いっぱい。 [sage] 2017/05/23(火) 15:04:02.31

find . -type f > hoge.txt
名無しさん@お腹いっぱい。 [sage] 2017/05/23(火) 15:30:08.76

ありがとうディレクトリのリストができました。
ディレクトリのリストから、htmlのリストを作ろうとすると、どうするのが
いいのでしょうか?クリックすると当該ディレクトリに飛ぶようにしたい
だけなのです。考えていたのはtexのファイルにするということなのですが。
名無しさん@お腹いっぱい。 [sage] 2017/05/23(火) 15:38:50.01
ハイパーリンク作るまでやるならshの範疇じゃない気がするが
なんでも聞かずに少しはぐぐったらどうよ
名無しさん@お腹いっぱい。 [sage] 2017/05/23(火) 16:05:32.00
ありがとうございます
ぐぐります
名無しさん@お腹いっぱい。 [sage] 2017/05/25(木) 08:52:58.76
w3m . -dump_source >dir.html
名無しさん@お腹いっぱい。 [sage] 2017/05/26(金) 02:49:12.98

テキストファイルをhtmlにするには拡張子を変えただけでいいらしいです。
さんが教えてくれてのはhtmlをtxtファイルにするための
ものだと思います。markdownでリストを作ろうと思います

ありがとうございました
名無しさん@お腹いっぱい。 [sage] 2017/05/26(金) 03:27:01.73
横から

Content-type: text/html
htmlはtextの中でどう書くかというルールに過ぎない
拡張子なんてのはexplorer.exeとかのソフトがどのアプリケーションソフトを起動するかのヒント程度
名前などどうでもいい

w3m . -dump_sourceは、.(このディレクトリ)をhtmlで書き出せ、と命令してる
名無しさん@お腹いっぱい。 [sage] 2017/05/26(金) 07:39:50.94
さん
やりたかったことがそのままできるコードを教えてくれてありがとうございます。
それなのに申し訳ありません。さんが教えてくれるまでその意義をわからず、
失礼なことを書きました。
さん
本当にありがとうございます。
名無しさん@お腹いっぱい。 [sage] 2017/06/02(金) 10:47:53.61
シェルスクリプトの本で、こんな便利なことができるという感じの
スクリプトを紹介するような感じでできてる本というのでお薦めの本は
あるでしょうか?
名無しさん@お腹いっぱい。 [sage] 2017/06/02(金) 11:25:57.91

クックブック
……ああでもあれはbashだったか
sage [] 2017/06/02(金) 20:17:29.65
(head ; tail ) < file
で、先頭10行・末尾10行が出るのはどういう仕組み?
FreeBSD+ash、bash で確認。
man にはそれらしい記述がないように見える。
名無しさん@お腹いっぱい。 [sage] 2017/06/02(金) 21:17:20.29
ちなみに GNU coreutils の head, tail だと

seq 10 | { head -1; tail -1; }
1

となる。以下の場合は

seq 10240 | { head -1; tail -1; }
1
10240

となる。これは head コマンドが一定量のデータをバッファリングした
まま処理を終了してまうから。BSD系のコマンドでは未使用なデータは
パイプバッファに戻してくれるので tail コマンドで読み出すことができる。
名無しさん@お腹いっぱい。 [sage] 2017/06/03(土) 15:49:14.51
ともにデフォルトが10行だからじゃないの?
名無しさん@お腹いっぱい。 [sage] 2017/06/04(日) 01:26:27.62

クックブック注文しました
ありがとう
名無しさん@お腹いっぱい。 [sage] 2017/06/05(月) 08:12:28.10
どうやって実現してるの?パイプではseekできないと
ずっと思ってた
名無しさん@お腹いっぱい。 [sage] 2017/06/05(月) 10:37:40.02
tailのソース読んでみたら?
名無しさん@お腹いっぱい。 [sage] 2017/06/06(火) 12:55:43.92

BSDは知らないけど、普通stdioで読む単位は4096byteとかだから
headがそれを読んでexitした場合残りをtailが読むことになる
入力データが4096byte以下ならheadしか受け取れないが、大きければ
headとtailがそれぞれ入力を受け取れる
パイプに戻すとかいうインタフェースはunixにはない
213 [sage] 2017/06/13(火) 13:42:47.20
どうもです。
要は head と tail でディスクリプタを共有してて、未 read の部分を tail が読んでいるんだと思うんだけど、
親子じゃないプロセスでディスクリプタ共有なんてできるんでしたっけ、と思って驚いた
(できてるから、できるんだろうけど)。

ちなみに tcsh でもできた。

ただ、下記の ★1 と ★2 で結果が違うのはどうしてなんでしょう。
コマンドかファイルかで、stdio のバッファリングの違いってあったっけ。

$ seq 100 > seq100.txt
$ seq 10024 > seq10024.txt
$ cat seq100.txt | { head -1 ; tail -1 ; } # ★1
1
$ { head -1 ; tail -1 ; } < seq100.txt # ★2
1
100
$ cat seq10024.txt | { head -1 ; tail -1 ; }
1
10024
$ { head -1 ; tail -1 ; } < seq10024.txt
1
10024
213 [sage] 2017/06/13(火) 13:51:01.95

> ちなみに GNU coreutils の head, tail だと
> seq 10 | { head -1; tail -1; }
> 1
> となる。
なお、FreeBSD でも
$ jot 10 | { head -1; tail -1; }
1
でした。

head・tail で共有しているのはディスクリプタだけであって、
stdio バッファの共有はしていないので、戻すってのが ungetc(3) 的な
ものを指しているのであれば、戻したとしても tail がそれを読めるわけでは
ないと思っています。
名無しさん@お腹いっぱい。 [sage] 2017/06/13(火) 15:00:33.86

seq 100は4096バイト以下だから。
seq 1042でtail -2
したら切れ目がわかるかと。
213 [sage] 2017/06/13(火) 15:13:53.06
★1も★2 も seq 100 なのに、なぜ結果が違うのか、というのが疑問なのであります。
名無しさん@お腹いっぱい。 [sage] 2017/06/13(火) 15:15:44.72
ファイルディスクリプタがプレーンファイルならlseekするから
名無しさん@お腹いっぱい。 [sage] 2017/06/13(火) 15:19:58.75
ごめん、mmapだった
名無しさん@お腹いっぱい。 [sage] 2017/06/14(水) 09:15:41.39

要するにの通りなんだけど
&#11088;1の書き方の場合、標準入力がパイプになるので(lseekできないので)tailには何も渡らない
&#11088;2の場合標準入力は通常ファイルseq100.txtなのでtailはlseekして読み直すから読める
213 [sage] 2017/06/14(水) 10:53:46.67
ありがとうございます。
ttps://svnweb.freebsd.org/base/head/usr.bin/tail/tail.c?revision=314436&view=markup#l227
で lseek で先頭に戻るってのが成功するか否か、ってことですね。
名無しさん@お腹いっぱい。 [sage] 2017/06/14(水) 11:09:43.34
head -1 じゃなくて read を使ってこんな事をしてたり

df -h | { read h; echo "$h"; sort -k5,5gr; }
名無しさん@お腹いっぱい。 [] 2017/07/01(土) 20:45:46.61
流石に上手いわ
名無しさん@お腹いっぱい。 [] 2017/07/01(土) 23:39:20.14

惚れる。UNIX の基本コマンドだけじゃん
名無しさん@お腹いっぱい。 [sage] 2017/07/05(水) 17:14:04.26

やるやん(´・ω・`)
名無しさん@お腹いっぱい。 [sage] 2017/07/08(土) 09:49:05.30

子同士だから親から引き継いだ同じものを共有してる
名無しさん@お腹いっぱい。 [sage] 2017/07/15(土) 18:10:48.03
Eclipse上でシェルスクリプトを動かしたいんだけど、どのサイトを参考にすればいいですか?
名無しさん@お腹いっぱい。 [sage] 2017/07/15(土) 18:28:08.93
site:2ch.net 付けてググれ
名無しさん@お腹いっぱい。 [age] 2017/07/31(月) 07:52:04.50
# 使用しているのは GNU/Linux なので微妙にスレチかもしれないです。
GNU/Linux では /bin/sh が /bin/bash へのシンボリックリンクになっています。
私が利用している Fedora 26, Linux Kernel 4.11.11 では
bash$ readlink -e `which sh`
/usr/bin/bash
でした。(Fedora では /bin 全体が /usr/bin へのシンボリックリンクです。そういう方針です)

ファイルシステム等と共にシェルスクリプトの高速化を図ろうと,
Bourne Shell 互換で GNU bash より低機能で処理が高速な GNU dash を
/bin/sh へのシンボリックリンクにしました。
bash# rpm -qa | grep -E "^dash"
dash-0.5.9-2.fc26.x86_64
bash# unlink `which sh` && ln -s /usr/bin/dash /usr/bin/sh

再起動すると Xorg およびディスプレイマネージャは正常に起動したのですが,
ログイン後デスクトップ環境(Xfce4)が起動しません。
エラーログを取得しようにもコンソールl(/dev/tty1とか)にさえログインできず,
結局外部から /bin/sh を /usr/bin/bash に割り当て直して無事ログインできました。
原因はデスクトップ環境を構築しているシェルスクリプトのどこかに bash 独自の機能を要する文法があると思われます。
そこで質問なのですが,実際にログインプロセスを踏まずにそれを再現できるシェルスクリプトの作り方を教えてください。
長くて申し訳ないです。よろしくおねがいします。
名無しさん@お腹いっぱい。 [sage] 2017/07/31(月) 07:59:41.19
内緒で妻のパソコンでインターネットして
ヌードとかHな写真を見まくっていたのですが、なんと
bネにかの表紙に血ゥていたエロ画荘怩ェパソコンの血繧ノ
表示されたままになって元に戻せません!
前はプーさんの画像だったのに、今はアソコにバイブを挿した豊丸の画像です・・・。。
再起動しても表示されたままなんです。
早く直さないと妻が夜勤から帰ってきてしまします!(看護婦なので・・・・)
至急助けてください!!!
OSはウィンドウズXPです。
よろしくお願いします。
名無しさん@お腹いっぱい。 [sage] 2017/07/31(月) 08:49:19.54

金属バットでPCフルスイングすれば?
名無しさん@お腹いっぱい。 [sage] 2017/07/31(月) 08:51:37.14
ここに到達する知識があるならgoogleで検索すれば見つかるだろうに
名無しさん@お腹いっぱい。 [sage] 2017/07/31(月) 08:57:00.00

再現する方法を模索するのではなく、再起動せずに切り分けすればいいだけでは?
tty でログインできなかったって点からすると、/usr/bin/sh を差し替えた後に再起動せずに
su - 一般ユーザ名 でテストするのが一番手っ取り早そう。

display-manager(gdmや同等のソフト) を停止した状態で tty でログイン(安全をみて tty1 と
tty2 など複数個所でログイン済にしておく)、 /usr/bin/sh を差し替えて再起動せずに
display-manager を起動してログインテストすればいいんじゃないでしょうか。
名無しさん@お腹いっぱい。 [sage] 2017/07/31(月) 09:07:15.67

これは履歴とかキャッシュ消せないだろうからどうせバレる
名無しさん@お腹いっぱい。 [sage] 2017/07/31(月) 09:10:25.45

Linux板へ
名無しさん@お腹いっぱい。 [sage] 2017/07/31(月) 09:10:52.08

懐かしコピペだな
名無しさん@お腹いっぱい。 [sage] 2017/07/31(月) 11:49:07.69

ありがとうございます。やってみます。
ご迷惑かもしれませんが,解決を見たら報告します。
名無しさん@お腹いっぱい。 [sage] 2017/07/31(月) 11:54:40.49

ありがとうございます。やってみます。
ご迷惑かもしれませんが,解決を見たら報告します。
名無しさん@お腹いっぱい。 [sage] 2017/07/31(月) 15:19:17.23

checkbashismsが使えるならそれでBashの機能の有無を確認出来る
ttp://wiki.archlinuxjp.org/index.php/Dash
名無しさん@お腹いっぱい。 [sage] 2017/07/31(月) 16:15:55.29
/bin/shを差し替えるなんてFedora側で想定した使い方じゃないんだから
そもそもそんなことやっちゃいけない
名無しさん@お腹いっぱい。 [sage] 2017/08/01(火) 02:25:49.77

ありがとうございます。
5000 箇所くらい不適合が見つかりました。
パッケージ管理されているシェルスクリプトも多くあり,
全部直すとシステムの破壊も(今更かもしれないですが)心配なのでやはり bash のままにしようかなとも考えています。


その通りなんですが dash は bash の4倍早いと聞いたのでつい……。
名無しさん@お腹いっぱい。 [sage] 2017/08/01(火) 02:59:57.01

autoconfのconfigureで5-10%速いくらい
ttps://lists.fedoraproject.org/pipermail/devel/2014-October/202891.html
SysVinitの昔ならともかくsystemdの今では関係ないだろうけどね
名無しさん@お腹いっぱい。 [sage] 2017/08/01(火) 03:05:36.12

chshだけでもしとけば
名無しさん@お腹いっぱい。 [sage] 2017/08/01(火) 08:24:31.41

4倍速いなんて誰が言ってたの
名無しさん@お腹いっぱい。 [sage] 2017/08/01(火) 09:51:33.66
/bin/sh置き換えるとか奇形児かよ
名無しさん@お腹いっぱい。 [sage] 2017/08/01(火) 10:19:55.09
configureで5-10%速いなら4倍どころじゃないだろうな
名無しさん@お腹いっぱい。 [sage] 2017/08/02(水) 20:07:41.14

debianはそういうとこあるぞ
名無しさん@お腹いっぱい。 [sage] 2017/08/03(木) 07:34:52.42
あれは必死に直した結果達成したもので、同じような努力をそのdistroで
やらないとできない

そういやFreeBSDも昔base systemからperl排除するという大きな仕事を
やってたなあ
名無しさん@お腹いっぱい。 [sage] 2017/08/03(木) 09:32:35.46
で、「4倍速い」のソースどこよ
名無しさん@お腹いっぱい。 [sage] 2017/08/03(木) 09:35:10.81
名無しさん@お腹いっぱい。 [sage] 2017/08/03(木) 21:23:18.47
シャア専用シェル
名無しさん@お腹いっぱい。 [sage] 2017/08/04(金) 03:14:55.27
シェルから特定のプログラムの標準入力にデータを流すにはどうしたらいいでしょうか。

何がしたいかというと、
stdinからのデータを処理するIPCで、サーバーサイドのプログラムに
シェル側からstdinに流してレスポンスがちゃんとできているかをチェックしたいのです。

サーバープログラムは stdin をistreamで処理するように組んでおり、
stdinで入ってくるデータはEOFで一区切りとし、EOFを検出後に
EOFフラグをクリアして、再度stdinにデータが流れてくるまでブロッキングするというループになっています。

本来はクライアントサイドからstdinへデータを流しますが、
サーバーサイドだけで簡単にチェックするために、

サーバーサイドはmy-server.elfとし、
$ ./my-server.elf
で起動状態にしておきます。
ここに対して、
コマンドライン上から テキストデータ+EOFを何度か送る方法はないでしょうか?
cat hoge | ./my-server.elf
とかだと、1回しかテストできないので、どうしたらいいでしょうか。
my-server.elfのプロセスIDはわかるので、そこに対してデータを送る方法があれば教えてください。
名無しさん@お腹いっぱい。 [sage] 2017/08/04(金) 04:14:32.69
移植性がよくわからないけど
cat hoge > /proc/<pid of server>/fd/1
名無しさん@お腹いっぱい。 [sage] 2017/08/04(金) 08:14:54.70
EOFってクリアできるものなの? よくわからんが
$ mkfifo /tmp/foo
$ exec < /tmp/foo
$ exec ./my-server.elf
で cat hoge > /tmp/foo とかどうよ
名無しさん@お腹いっぱい。 [sage] 2017/08/04(金) 13:23:10.99

EOFってstdinの送信側がcloseしたときに送られるんじゃないの?
それ実は再コネクトしてたりしない?
名無しさん@お腹いっぱい。 [sage] 2017/08/06(日) 01:34:21.08

> コマンドライン上から テキストデータ+EOFを何度か送る方法はないでしょうか?
テキストデータにEOF(^D)を入力するとか
^DはCtrl+V、Ctrl+D
ttps://en.wikipedia.org/wiki/End-of-Transmission_character
名無しさん@お腹いっぱい。 [] 2017/08/09(水) 11:18:15.17
1<br>2<br>3<br>4<br>



1
2
3
4

にシェルで置き換えるコマンド教えれ
今viで開いて置き換えてます・・・
名無しさん@お腹いっぱい。 [sage] 2017/08/09(水) 11:21:03.77

sed
名無しさん@お腹いっぱい。 [sage] 2017/08/09(水) 11:22:28.73
sed でもなんでもいいじゃん
名無しさん@お腹いっぱい。 [sage] 2017/08/09(水) 13:07:15.54
あえてヘッドレスブラウザを使ってみよう
名無しさん@お腹いっぱい。 [sage] 2017/08/09(水) 13:07:21.78
echo '1<br>2<br>3<br>4<br>' | tr '<>' '\n\n' | fgrep -v br
名無しさん@お腹いっぱい。 [sage] 2017/08/09(水) 14:41:10.39
ありがとうございます
sedで出来ました

というか所定の文字列(今回は<br>)を改行に置き換えることと
改行を所定の文字列に置き換えることを混同していました

たしか後者はsedなどでできずperlとかでやった覚えがあります
まったくもって私の勘違いでした・・・
名無しさん@お腹いっぱい。 [sage] 2017/08/09(水) 14:49:33.52
unhtmlだと改行入らないっけ

|w3m -dump
名無しさん@お腹いっぱい。 [sage] 2017/08/13(日) 15:47:35.48
macのファイル名に使われるエンコーディングてutf-16だったんだね
てっきり、utf-8だと思ってた
ttp://tama-san.com/hfsplus/

んで、次のOSでは非正規化になるみたい
ttps://developer.apple.com/library/content/documentation/FileManagement/Conceptual/APFS_Guide/FAQ/FAQ.html

これで少し楽になれそう
名無しさん@お腹いっぱい。 [sage] 2017/08/13(日) 15:56:24.85
内部表現はutf-16
ターミナルで扱うときはutf-8
名無しさん@お腹いっぱい。 [sage] 2017/08/13(日) 18:10:53.30
知らなかった
ありがとう
名無しさん@お腹いっぱい。 [sage] 2017/08/20(日) 22:32:53.01
シェルスクリプト とはほとんど関係ないんだけど,X 使ってる時,ターミナルエミュレータに ファイルマネージャの「ファイル」や「フォルダ」を D&D したらその絶対パスが入力されるんだな。
これ今迄知らずに手入力してた。
名無しさん@お腹いっぱい。 [sage] 2017/08/20(日) 22:38:57.86
なんかしらんけど、本当だ(´・ω・`)
名無しさん@お腹いっぱい。 [sage] 2017/08/20(日) 22:39:12.28
これどういう原理なんだろ
名無しさん@お腹いっぱい。 [sage] 2017/08/20(日) 23:03:34.71
X 使ってないから分からんが、Windows でエクスプローラからコマンドプロンプトにドラッグ&ドロップするとファイルパスが入力されるのと同じ機能かな。
意外と知らない人もいるみたいだけど、便利だよね。
名無しさん@お腹いっぱい。 [] 2017/08/21(月) 01:53:29.93
でもXってマウスすべるよな
名無しさん@お腹いっぱい。 [sage] 2017/08/21(月) 08:54:21.72
Windows でも確認できた。へー,結構便利だな。
名無しさん@お腹いっぱい。 [sage] 2017/08/21(月) 10:52:29.07
なぜ関係ない話をここでやるの
名無しさん@お腹いっぱい。 [sage] 2017/08/21(月) 17:33:16.40
じゃあ関係ある話提供してください。
名無しさん@お腹いっぱい。 [sage] 2017/08/21(月) 17:38:48.75
どうでもいいけどそれずっとsakuraエディタ使ってやってたわ
エディタ上にファイルペーストすると絶対パスに変換される
名無しさん@お腹いっぱい。 [sage] 2017/08/21(月) 18:31:57.12
どうでもいいなら書き込むな
名無しさん@お腹いっぱい。 [sage] 2017/08/21(月) 19:04:04.21
じゃあどうでもよくない話提供してください。
名無しさん@お腹いっぱい。 [sage] 2017/08/21(月) 19:13:51.68
DEの機能じゃないの
ファイルマネージャー使わないが
名無しさん@お腹いっぱい。 [sage] 2017/08/22(火) 09:14:59.98
Terminology「ガタッ(呼ばれたか)」
名無しさん@お腹いっぱい。 [sage] 2017/08/22(火) 13:27:24.37
Terminology って何がすごいの? 画像の表示なら xterm ですら可能なのに。
名無しさん@お腹いっぱい。 [sage] 2017/08/22(火) 18:53:12.44
lsとかした後ターミナル内でのD&Dとかの変態操作
動画再生と動画壁紙の無駄機能

すごくはない
286 [sage] 2017/08/23(水) 03:10:27.50
ターミナル内で D&D できんのか。そりゃすげえ。
名無しさん@お腹いっぱい。 [sage] 2017/08/29(火) 10:07:33.36
unix プログラミング環境という本の問題でpickというプログラムを作ったんだ。
引数ごとに出力するかを対話して、"y"が押されたものだけ出力するという単純なもの。
---
$ pick a b
a? y
a
b? n
$
---

問題ではさらに、「引数が無かった時は標準入力を読みに行くようにせよ」と続く。
まあ、パイプで挟まれたりしても問題なく使えるようにしろってことなんだと思う。

で、以下の様に書いて、問題なく動いたんだけど、
あまりシェル書いたことないもので・・・変な書き方してないかとかコメント頼みます。
---
exec 10<&0 11>&1 0<&2 1>&2

input='echo "$@"'
if [ $# -eq 0 ] ; then
input='cat <&10'
fi

for i in `eval $input`
do
echo -n "$i ? "
read response
case $response in
y*) echo $i >&11 ;;
esac
done
---
名無しさん@お腹いっぱい。 [sage] 2017/08/29(火) 14:45:14.34
シェルじゃなくてシェルスクリプト
名無しさん@お腹いっぱい。 [sage] 2017/08/29(火) 20:34:15.21

その本知らないけど、標準入力を読み切ったあとをキー入力とするより
read response < /dev/tty
でキー入力する方が一般的じゃないかな
名無しさん@お腹いっぱい。 [sage] 2017/08/30(水) 10:04:26.25

実は、vmware上のlinuxにテラターム使ってテストしてたんだけど、
(unixと書いてあるのにスマン)
その時の端末のデバイスファイル?とやらが/dev/pts/0だったのよ。
`tty`でもパイプ使ってると「あいまいです」みたいに怒られちゃって、
苦し紛れに&2を使ってしまった。。

接続端末のデバイスファイルをいつでも取得できる方法ってあるのかな?
名無しさん@お腹いっぱい。 [sage] 2017/08/30(水) 10:21:44.01
あ、あと今さっき教えてもらった
read response < /dev/tty
↑が、上手くいった!ありがと〜

unixだとreadコマンドはリダイレクションができなかったらしいが、
linuxだと出来るのか。。。
名無しさん@お腹いっぱい。 [sage] 2017/09/06(水) 14:03:04.96
1. find . -name aaa -o -name bbb
はうまくいくけど
2. find . -name aaa -o -name bbb -print
では aaa が引っかからなくて、
3. find . \( -name aaa -o -name bbb \) -print
だと OK な理由がいまいちわかりません。括弧なしだと
4. find . -name aaa -o \( -name bbb -print \)
と解釈されてしまうからってのはわかりますが、
 「アクション指定なしの場合 -print の挙動となる」
 「exp1 -o exp2 で exp1 が偽なら exp2 を実行しない」
であるならば、1 が表示されて、2・4 の aaa が表示されないのはなぜでしょう。
ちなみに、GNU find(1) には下記。
 If the expression contains no actions other than -prune, -print is performed on all files for which the
 expression is true.
FreeBSD の find(1) は下記でした。
 If none of -exec, -ls, -print0, or -ok is specified, the given expression shall be
 effectively replaced by ( given expression ) -print.

と書いていて思いましたが、括弧等や -o に関係なく、引数 expression のどこかに
アクションが 1つでも記述されていれば、-print を補完しない、ってことですかね。
294 [sage] 2017/09/06(水) 14:14:11.12
> 括弧等や -o に関係なく、引数 expression のどこかに
> アクションが 1つでも記述されていれば、-print を補完しない、ってことですかね。
ということのようでした。

ttps://svnweb.freebsd.org/base/head/usr.bin/find/function.c?revision=314436&view=markup#l1344
-print とかが見つかると isoutput=1 とする。

ttps://svnweb.freebsd.org/base/head/usr.bin/find/find.c?revision=314436&view=markup#l113
!isoutput の場合のみ、-print を補完する。

expression のツリー構造をたどって、アクションがない expression が
見つかったら全部 -print を補完する、としていたらよかった気がしますが、
いまさらどうしようもないですね。
名無しさん@お腹いっぱい。 [sage] 2017/09/08(金) 02:42:55.52
$ bc <<< '6*7'
42
とかの`<<<` ってなんという名称ですか?
ヒアドキュメンとだとずっと思っていたのですが,その仕様を調べようとしたらヒアドキュメントというのは
$ cat << . > ~/foo.txt
a
b
c
.
の << . から . を指すようなのでした。
名無しさん@お腹いっぱい。 [sage] 2017/09/08(金) 04:08:06.24
ヒアストリング
名無しさん@お腹いっぱい。 [sage] 2017/09/08(金) 07:40:56.64
ヒアストリングは未だに使い方がよく分かってない
名無しさん@お腹いっぱい。 [sage All You Need is Shell] 2017/09/09(土) 13:43:30.38

ありがとうございます!
お礼が遅くなり申し訳無いです。
名無しさん@お腹いっぱい。 [] 2017/09/11(月) 20:58:07.04
あるマシン環境を仮想マシンとかでバックアップしておいて
1つのマシン上であるサーバを構築して、
historyからその構築したコマンド群を全部シェルスクリプトに
コピペして、そのシェルスクリプトを
サーバ構築前のマシン上で実行したら全く同じサーバが一瞬で構築できるの?
名無しさん@お腹いっぱい。 [sage] 2017/09/11(月) 22:00:14.58
chefとか使えよ
名無しさん@お腹いっぱい。 [sage] 2017/09/11(月) 22:47:46.40
冪等性が保証されてるスクリプトなら同じサーバーができる
名無しさん@お腹いっぱい。 [sage] 2017/09/12(火) 16:18:38.21
ネットワーク経由のインストールとかしてて
サーバの状態により変わりそう
名無しさん@お腹いっぱい。 [sage] 2017/09/12(火) 18:22:51.99
サーバーじゃないけど仮想マシンで似たような事してる
ヒストリーからってより自分でメモしといたコマンド群だけど
けっこう省力化出来てる
あとスクリプト書いてから時間が経過するとソフトウェアの
ダウンロード元のURLが変わったりしてエラーが出ることは多々ある
名無しさん@お腹いっぱい。 [sage] 2017/09/12(火) 20:18:24.96
結局リプレイしたいときにはアプリやOSのバージョンが微妙に上がってて、
手順を修正しながらやらなきゃダメってのはありがちだな。
名無しさん@お腹いっぱい。 [] 2017/09/13(水) 13:26:43.86
変数やコマンド文字列の展開と
ワイルドカード/正規表現の展開って原理が違うの?
名無しさん@お腹いっぱい。 [sage] 2017/09/13(水) 14:55:00.94
どういう意味?
名無しさん@お腹いっぱい。 [sage] 2017/09/14(木) 00:00:47.00

言ってることが曖昧だが,「グロブ」と「正規表現」は違うよ
原理が違うかどうかは知らんが,少なくとも挙動は別物
例えばアスタリスクはグロブだとワイルドカードとして,正規表現だとクリーネ閉包としての役割を果す
名無しさん@お腹いっぱい。 [sage] 2017/09/14(木) 01:58:23.04
グロブ(含ワイルドカード)と正規表現の違いを聞いてるのではないでしょう
名無しさん@お腹いっぱい。 [sage] 2017/09/14(木) 05:18:47.05
質問の意味がわかんないんです(><)
名無しさん@お腹いっぱい。 [sage] 2017/09/14(木) 06:04:07.07
すみませんが詳しい方のみ回答をお願いします
名無しさん@お腹いっぱい。 [sage] 2017/09/14(木) 06:59:44.81
ここにはいません
名無しさん@お腹いっぱい。 [sage] 2017/09/14(木) 10:48:20.75
みなさんコマンドの頭にバックスラッシュって付けてます?
私は安全を期して付けているのですが そうしているシェルスクリプトが以外に少ないので
気にしなくてもいいんですかね
名無しさん@お腹いっぱい。 [sage] 2017/09/14(木) 10:59:51.81
付けないとどんな危険があると想定してるの?
173 [sage] 2017/09/14(木) 12:57:09.36
alias cp='rm -rf'
cp a --> rm -rf a
\cp a --> cp a
名無しさん@お腹いっぱい。 [sage] 2017/09/14(木) 13:21:22.76
へぇ
名無しさん@お腹いっぱい。 [sage] 2017/09/14(木) 13:26:37.84
cshだとaliasが機能しちゃうんだね
313 [sage] 2017/09/14(木) 13:42:49.97
173 --> 313
名無しさん@お腹いっぱい。 [sage] 2017/09/14(木) 14:22:08.99
cshはデフォルトだと必ず.cshrc読んじゃうからねぇ
名無しさん@お腹いっぱい。 [sage] 2017/09/14(木) 14:51:18.91

翻訳するとこういう感じだと想像

変数の展開: variable expansion ( e.g. ${var} )
コマンド文字列の展開: command substitusion ( e.g. $(command) )
ワイルドカードの展開: filename expansion ( e.g. *.sh )
正規表現の展開: ???

正規表現の展開って何? find -regexとかのこと言ってるの?
あと原理って? 同じか違うか知りたい理由は何?
人に伝わるように質問しないと誰も分からないぞ
名無しさん@お腹いっぱい。 [sage] 2017/09/14(木) 14:57:45.50
cshを前提にしちゃいかんでしょう
名無しさん@お腹いっぱい。 [sage] 2017/09/14(木) 16:44:13.36

前提というか、 はそういう環境なんだなと深読みしただけ
名無しさん@お腹いっぱい。 [sage] 2017/09/14(木) 17:20:02.07
いまどきcshでスクリプトを書くおとこの人って…
名無しさん@お腹いっぱい。 [sage] 2017/09/14(木) 18:02:43.44
はcshじゃないな。
むかしのcshで痛い目にあってなますを吹いてるとか?
名無しさん@お腹いっぱい。 [sage] 2017/09/14(木) 18:37:11.41

深読みが過ぎるのでは
Bシェル系使ってて心配しすぎてるだけという可能性もある
名無しさん@お腹いっぱい。 [sage] 2017/09/16(土) 04:51:53.35
を見て思ったのが シェバンの書き方。
#!/bin/sh -
と書けと駱駝にはあったが 存外そうしている Shell Script がない
まあ余程のことがない限り sh がオプションを勘違いするなんてないが
名無しさん@お腹いっぱい。 [sage] 2017/09/16(土) 08:20:15.68
#!/bin/sh -
set -x
set -u
...
set +u
set +x
名無しさん@お腹いっぱい。 [sage] 2017/09/17(日) 11:16:56.16
set −xって要らないでしょ
名無しさん@お腹いっぱい。 [sage] 2017/09/17(日) 13:02:27.61
sexに空目した
名無しさん@お腹いっぱい。 [sage] 2017/09/18(月) 09:06:16.47
set -u 便利だな
名無しさん@お腹いっぱい。 [age] 2017/09/18(月) 17:34:05.37
新しい関数として
ls () {
  \ls --width=`\echo $COLUMN`
}
という関数を作って,ls のエイリアスとして動作させたいのですが,
コマンドラインで $ ls と入力すると無限ループに陥ります。
多分というか確実に関数 ls が自分自身を呼び出している為に生じる現象だと思います。
これを回避し,ls という関数を安全に作製するにはどうすればいいでしょうか。
常用しているシェル bash です。
bash 独自の拡張でそのような(関数の再帰を防ぐ)機能があれば教えて下さい。
名無しさん@お腹いっぱい。 [sage] 2017/09/18(月) 17:35:32.76
関数中のlsを絶対パスで呼ぶ
名無しさん@お腹いっぱい。 [sage] 2017/09/18(月) 17:44:16.70
command ls --width=$(echo ${COLUMN:-50});

とかでいいんじゃない
331 [sage] 2017/09/18(月) 18:25:53.39
様、 様、ありがとうございます。
どちらの方法でも上手く行きました。身勝手ながら 様の方法を採ることにしました。
蛇足気味ですが、最終的に以下のような関数にしました。良かったら添削してください。
POSIX とかは考えてないです。
function ls () {
  local _opt="--ignore-backups --color=always --format=across --group-directories-first --indicator-style=classify --literal --sort=time --width=`\echo $COLUMNS`"
  command ls $_opt
}
331 [sage] 2017/09/18(月) 18:28:49.27
s:/`\\echo $COLUMNS`/$(\\echo ${COLUMNS})/
331 [sage] 2017/09/18(月) 18:55:59.93
Better?
function ls () {
  local _opt="--ignore-backups --color=always --format=across --group-directories-first --indicator-style=classify --literal --sort=time --width=$(\command echo ${COLUMNS})"
  \command -p ls $_opt $@
}
名無しさん@お腹いっぱい。 [sage] 2017/09/18(月) 20:05:49.92
lsを常に特定のオプション付けて実行したいのならLS_OPTIONS使えばいいと思う
それからfunction name ()はfunction nameかname () のどちらかにすべき
name()の方が汎用性高い
331 [sage] 2017/09/18(月) 20:49:26.19

ありがとうございます!
LS_OPTIONS は知りませんでした。MANOPT や LESS みたな感じなんですかね。
函数は POSIX に合わせて ls () にしようと思ったんですが,ちょっと個人的に気持ち悪くて,どうしても function が取っ払えませんでした……。
名無しさん@お腹いっぱい。 [sage] 2017/09/18(月) 21:20:07.09
別に身勝手ってほどのことでもなくね
名無しさん@お腹いっぱい。 [sage] 2017/09/21(木) 02:41:20.96
シェルの解釈を標準出力に印刷するコマンドってある/作れますか?
グロブやエイリアスがどう解釈/引き渡されるのかを知りたいです。
$ showraw 'ls */*'
ls a/a a/b a/c b/a c/a c/b
みたいな。
検索も一通りしたのですが見付からないです。
シェルによってシェルそれ自身の機能を調べるのは無理なんですかね。
340 [age] 2017/09/21(木) 02:42:16.10
すいません。age ます。
名無しさん@お腹いっぱい。 [age] 2017/09/21(木) 02:44:04.33
$ showraw 'ls */*'
ls -F -A a/a a/b a/c b/a c/a c/b
エイリアスも解釈されるのでこんなかんじですね。
名無しさん@お腹いっぱい。 [sage] 2017/09/21(木) 05:13:34.59
コマンドの方はtype ls 引数の方はecho */* で良くね
取り敢えずshとbashで確認
名無しさん@お腹いっぱい。 [sage] 2017/09/21(木) 06:12:05.17
$ ls */*
と入力したところで ESC \C-e をタイプするとエイリアスが展開され
\C-x* をタイプするとワイルトカードが展開される
名無しさん@お腹いっぱい。 [344] 2017/09/21(木) 06:21:42.53
すまん、bash限定
名無しさん@お腹いっぱい。 [] 2017/09/21(木) 07:24:19.18


$ set -x
$ ls */* >/dev/null
名無しさん@お腹いっぱい。 [sage] 2017/09/21(木) 08:38:01.77
--
ありがとうございます。しかしできればエイリアスごと展開したいのです。


おわ!まさにこんな感じです。多分コマンドプロンプト関連の命令群も一緒に出力されますが,これはまあ awk か何かで頑張って切り取ります。一応 zsh,bash,dash で確認できました。
名無しさん@お腹いっぱい。 [sage] 2017/09/26(火) 02:43:18.09

set -u 便利ですね
~/.bashrcに書こうかしら
とくに弊害ないですよね?
名無しさん@お腹いっぱい。 [sage] 2017/09/28(木) 10:22:22.57
すいません。わかるかたいたら教えてください。

基本的にカンマ区切りの行なのですが、1列目が""で囲まれ、"aaa,bbb,ccc"のように
なることがあります。
1列目のみに発生します。
この1列目のケースだけ、カンマをスペース等に置換したいと思っています。

イメージはこうです。

"aaa,bbb,ccc",AAAA,BBBB,CCCC
aaa,AAAA,DDDD,EEEE

"aaa bbb ccc",AAAA,BBBB,CCCC
aaa,AAAA,DDDD,EEEE

理由はエクセルに取り込むときにずれてしまうためです。

awkで出来た気がするのですが、うまく出来ません。
どなたか心当たりないでしょうか。
名無しさん@お腹いっぱい。 [sage] 2017/09/28(木) 10:41:01.84
Excelならダブルクオートちゃんと扱うはずだよ
勘違いか、変な文字入ってない?
名無しさん@お腹いっぱい。 [sage] 2017/09/28(木) 11:09:26.14
テキストをコピーして貼り付ける時にカンマ区切りでバラすように貼り付けると囲んでてても関係なくバラさなかったっけ?
名無しさん@お腹いっぱい。 [sage] 2017/09/28(木) 11:10:20.00
そんなことなかったわ
名無しさん@お腹いっぱい。 [sage] 2017/09/28(木) 11:41:08.89
もっとうまく書けそうな気がするものの
perl -pe 'if (/^"/) { @f = split/"/, $_, 3; $f[1] =~ s/,/ /g; $_ = join "\"", @f }'
名無しさん@お腹いっぱい。 [sage] 2017/09/28(木) 12:17:55.02
awkとBEGINで昔出来た記憶があるのですが。上手くいかず。


あれ、確かにEXCELには想定ではれました、すいませんさっきも同じにようにはったつもりで、ばらされたのですが。


一行Perlの文法の意味はわかりませんが、確かに出来ました!
名無しさん@お腹いっぱい。 [sage] 2017/09/28(木) 22:34:38.91
区切り文字を"にして配列に取り込んで,を に置換えた後、最初と最後に"を追加する
perl -F\" -anle '$F[1] =~ s/,/ /g; $F[1] =~ s/(.+)/\"$1\"/; print @F'

awkでは
awk 'BEGIN {FS="\""; OFS="\""} {gsub(","," ",$2); print $0}'

でいいような、なんか自信ないけど
名無しさん@お腹いっぱい。 [sage] 2017/09/28(木) 22:48:57.65
GNU awk の FPAT を使ってこんな感じで

gawk -vFPAT='(".+?"|[^,]*)' -vOFS=, '{gsub(/,/," ",$1);print}' data.csv
名無しさん@お腹いっぱい。 [sage] 2017/09/29(金) 04:05:27.30
perl -pe 's/^("[^"]*")/$1=~s|,| |gr/e'
名無しさん@お腹いっぱい。 [sage] 2017/09/29(金) 16:42:39.76
perl -pe 's/,(?=.*\")/ /g'
名無しさん@お腹いっぱい。 [sage] 2017/09/29(金) 17:03:38.90
suge-
名無しさん@お腹いっぱい。 [sage] 2017/09/30(土) 13:09:25.90

#!/bin/sh
IFS=\"
while read X Y Z ; do
  if [ "$X" = "" ] ; then
    echo -n \"$Y\" | sed 's/,/ /g'
    echo $Z
  else
    echo $X
  fi
done
名無しさん@お腹いっぱい。 [sage] 2017/10/02(月) 11:37:31.18
sed '/^"[^"]*"/{H;s///;x;s/\n//;s/^\("[^"]*"\).*/\1/;s/,/ /g;G;s/\n//;}'
名無しさん [] 2017/10/12(木) 11:03:43.53
bashで変数展開するときに、名前末尾にハイフン付けるのはどういう意味なんでしょうか?

${abc-}
名無しさん@お腹いっぱい。 [sage] 2017/10/12(木) 13:43:34.47

ttps://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBB
名無しさん@お腹いっぱい。 [sage] 2017/10/12(木) 14:06:07.63
今まさにそのページ読んでたけど、:いるよな
ナシの使い方なんてあったっけか
名無しさん@お腹いっぱい。 [sage] 2017/10/12(木) 16:13:02.77
> コロンを省略した場合には設定されているかどうかのみを調べます。
名無しさん@お腹いっぱい。 [sage] 2017/10/12(木) 16:37:37.56
何度か読み返してようやく理解した
unsetされてるか空値が入ってるかの違いに対応出来るのか
名無しさん@お腹いっぱい。 [] 2017/10/13(金) 18:57:11.77
ログイン時に読み込まれる ~/.profile ファイルは,「誰が」読み込んでいるのでしょうか。
普通 sh もしくはその代替シェルかなと思うのですが,実際はどうなのか気になります。
というのも,私が普段使っている Debian GNU/Linux ではデフォルトシェルは bash に指定しているのですが,~/.profile の中に bash っぽい変数 (${HOGE} という書き方) があったので。
名無しさん@お腹いっぱい。 [sage] 2017/10/13(金) 19:08:59.70
読んでみたらいいじゃない
起動のところ
名無しさん@お腹いっぱい。 [sage] 2017/10/13(金) 19:12:36.61
${HOGE}はbashに限らないよ
名無しさん@お腹いっぱい。 [sage] 2017/10/14(土) 00:33:15.35

誰へのレス?
名無しさん@お腹いっぱい。 [sage] 2017/10/14(土) 00:33:50.98

Linuxの質問はLinux板で
名無しさん@お腹いっぱい。 [sage] 2017/10/14(土) 00:37:55.44


くだらねえ質問はここに書き込め!Part 229
ttp://mao.5ch.net/test/read.cgi/linux/1505217859/

初心者の質問相談にやさしく答えるスレ Part9
ttp://mao.5ch.net/test/read.cgi/linux/1504269873/
名無しさん@お腹いっぱい。 [sage] 2017/10/14(土) 00:56:47.50

もしかしてこの人?
ttps://mao.5ch.net/test/read.cgi/linux/1504269873/343
370 [sage] 2017/10/14(土) 00:58:01.90
あぁ、すまん
へのレスか
たしかに${HOGE}記法はたいていのshで使えるね
370 [sage] 2017/10/14(土) 00:58:50.55
じゃなくてか、、、
名無しさん@お腹いっぱい。 [] 2017/10/20(金) 11:02:46.23

何を言ってるのがわからん。bshが元祖なのに。
370 [sage] 2017/10/20(金) 17:00:36.31
余計なレスだったんでわからんならわからんでいいよ
名無しさん@お腹いっぱい。 [sage] 2017/10/21(土) 01:22:29.89
スレチ気味だけど,ある種の Shell って,
$ cd ///////
みたいなことをするとルートディレクトリだと認識するんだな。
個人的に ~ がすごく打ちにくい位置にあるので // を ~ だと解釈させようと試行錯誤してるときに発見した。
これはルートディレクトリが特別って訳じゃなく,
$ ls /usr////bin///////
みたいなことでも問題ない。ということは // == ~ にすることは Shell のソース弄るくらいしか方法がないということになる。
俺みたいな無駄な努力をしないために残す
名無しさん@お腹いっぱい。 [sage] 2017/10/21(土) 01:32:07.61
それシェルの機能じゃなくね?
名無しさん@お腹いっぱい。 [sage] 2017/10/21(土) 01:36:03.89
こういうのも開けるし
ttps://mevius.5ch.net///test////read.cgi/////unix//////1489979246///////l50
名無しさん@お腹いっぱい。 [sage] 2017/10/21(土) 08:08:40.09
もしかして RFC とかで実装が統一されてんのか。
370 [sage] 2017/10/21(土) 14:49:37.55

cdについてはPOSIXで決まっている
ttp://http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cd.html">ttp://pubs.opengroup.org/onlinepubs/9699919799/utilities/cd.html
の8のc

>>380
それはまた別の話
名無しさん@お腹いっぱい。 [sage] 2017/10/21(土) 14:51:29.58
$ /bin/echo /usr////bin///////
/usr////bin///////
$

となるので、lsについてはシェルが解釈してるわけではなくlsが解釈していると思われる
名無しさん@お腹いっぱい。 [sage] 2017/10/21(土) 14:55:41.90
まあ//を~にしたいならシェルのキーバインド使えばいいんじゃないですかね
名無しさん@お腹いっぱい。 [sage] 2017/10/21(土) 15:01:35.03
ちなみにこんなんなったりする
シェルの種類によって挙動は違うかも

$ cd //
$ pwd
//
$

理由は
ttp://www.unixguide.net/unix/bash/E10.shtml
名無しさん@お腹いっぱい。 [sage] 2017/10/21(土) 15:03:36.25
キーバインドいじっちゃうと
「http://」を打とうとして「http:~」になったりして困らないか
名無しさん@そうだ選挙に行こう! Go to vote! [sage] 2017/10/22(日) 16:52:10.67

「An implementation may」だから必ずではないのでは
名無しさん@お腹いっぱい。 [sage] 2017/10/22(日) 21:04:49.39
必ずって言ったっけ
名無しさん@お腹いっぱい。 [sage] 2017/10/22(日) 21:24:08.21
bashはパス中の複数の/を一つにするはず
名無しさん@お腹いっぱい。 [sage] 2017/10/22(日) 22:40:16.51

名無しさん@お腹いっぱい。 [sage] 2017/10/26(木) 13:24:16.45
ファイルをリネームしてコピーし続けるスクリプトなんですが
コマンドが見つからないと出てよくわかりません

#/bin/sh

PATH='/var/log/'
PATH2='dnsmasq.log'
DOT='.'

for i in 6 5 4 3 2 1
do
PATH3=$PATH$PATH2$DOT$i
PATH4=`expr $i - 1`
PATH5=$PATH$PATH2$DOT$PATH4
mv $PATH5 $PATH3
done

PATH6=0

mv $PATH$PATH2 $PATH$PATH2$PATH6

exit 0
名無しさん@お腹いっぱい。 [sage] 2017/10/26(木) 13:29:36.84

for VAR in ARGS; do
command;
done
名無しさん@お腹いっぱい。 [sage] 2017/10/26(木) 13:30:47.44
sh -xで実行してみると以下の通り出力されました
+ PATH=/var/log/
+ PATH2=dnsmasq.log
+ DOT=.
+ PATH3=/var/log/dnsmasq.log.6
+ expr 6 - 1
./splitLog.sh: 1: ./splitLog.sh: expr: not found
+ PATH4=
+ PATH5=/var/log/dnsmasq.log.
+ mv /var/log/dnsmasq.log. /var/log/dnsmasq.log.6
./splitLog.sh: 12: ./splitLog.sh: mv: not found
(省略)
+ PATH3=/var/log/dnsmasq.log.1
+ expr 1 - 1
./splitLog.sh: 1: ./splitLog.sh: expr: not found
+ PATH4=
+ PATH5=/var/log/dnsmasq.log.
+ mv /var/log/dnsmasq.log. /var/log/dnsmasq.log.1
./splitLog.sh: 12: ./splitLog.sh: mv: not found
+ PATH6=0
+ mv /var/log/dnsmasq.log /var/log/dnsmasq.log0
./splitLog.sh: 17: ./splitLog.sh: mv: not found
+ exit 0
名無しさん@お腹いっぱい。 [sage] 2017/10/26(木) 13:46:18.65
とりあえず何がしたいかを書け
そんな汚いもん見せられても何がしたいのか分かりにくい
名無しさん@お腹いっぱい。 [sage] 2017/10/26(木) 13:51:57.00
PATH潰すんなら外部コマンドはフルパスで書かんと
名無しさん@お腹いっぱい。 [sage] 2017/10/26(木) 14:02:38.34
フルパスで書かないといけなかったんですね…
修正してみたらできました、ありがとうございます!
名無しさん@お腹いっぱい。 [sage] 2017/10/26(木) 14:11:58.47
ようわからんがsavelogコマンドみたいなことがしたいのか
名無しさん@お腹いっぱい。 [sage] 2017/10/26(木) 14:27:19.72
PATHがきしょい
名無しさん@お腹いっぱい。 [sage] 2017/10/26(木) 15:33:20.43

「フルパスで書かなきゃいけない」のではない
$PATHを上書きするのがマズい
名無しさん@お腹いっぱい。 [sage] 2017/10/26(木) 15:35:16.21
これ1&#12316;6までファイル全部消えるんじゃね?
名無しさん@お腹いっぱい。 [sage] 2017/10/26(木) 15:35:32.78
1から6まで
400 [sage] 2017/10/26(木) 15:37:15.23
あ、すまん勘違い
逆だった
名無しさん@お腹いっぱい。 [sage] 2017/10/26(木) 16:21:22.80
5を6にリネーム~0を1にリネーム
そのあと最新のログを0にリネームじゃないかな
どっちにしろゴリ押し感半端ないが
名無しさん@お腹いっぱい。 [sage] 2017/10/26(木) 16:30:18.25

$PATHって環境変数ですよね…
何故気づかなかったんだろう
お恥ずかしい限りです
名無しさん@お腹いっぱい。 [sage] 2017/10/26(木) 16:37:04.75
あーそういうことか、403のお陰でやりたいことは分かった
名無しさん@お腹いっぱい。 [sage] 2017/10/26(木) 18:34:54.50
こうすればわかりやすいですかね

#!/bin/sh

DIR=/var/log/
FILE=dnsmasq.log;
START=0

for i in `seq 1 6`
do
DEC=`expr $i - 1`
cd $DIR
mv "${FILE}.${DEC}" "${FILE}.${i}"
done

cd $DIR
mv $FILE "${FILE}.${START}"

exit 0
名無しさん@お腹いっぱい。 [sage] 2017/10/26(木) 18:56:39.92
毎回cdするのは無駄やろ
名無しさん@お腹いっぱい。 [sage] 2017/10/26(木) 19:01:29.48
個人的にexpr嫌いなのもあって$(())使っちゃうな
mv "${FILE}.$((i-1))" "${FILE}.$i"
あとseq間違ってね?
seq 6 1 -1
名無しさん@お腹いっぱい。 [sage] 2017/10/26(木) 19:25:35.16
これだと全部ログ.0になっちゃいますね
ありがとうございます!
名無しさん@お腹いっぱい。 [sage] 2017/10/28(土) 17:54:16.26
logrotateの真似したいのかな
名無しさん@お腹いっぱい。 [sage] 2017/10/28(土) 19:36:18.05
素直にそっち使った方が楽に出来るよね
名無しさん@お腹いっぱい。 [sage] 2017/10/28(土) 22:25:53.38
そっちを使うほうが楽、ということを学習するにはまずは自分で書いてみて、大変だぜてことを理解しないと
名無しさん@お腹いっぱい。 [sage] 2017/10/31(火) 13:10:26.11
昔solarisで見たlogrotateはshell scriptだった
どこかで見れれば参考になるかも
名無しさん@お腹いっぱい。 [sage] 2017/10/31(火) 13:39:18.79
あれはあんまりきれいじゃないから参考にしない方がいい
名無しさん@お腹いっぱい。 [sage] 2017/10/31(火) 13:48:20.70
この /usr/lib/newsyslog ね
ttp://www.tcp-ip.or.jp/~ikken/intra/check.txt
名無しさん@お腹いっぱい。 [sage] 2017/10/31(火) 15:47:40.56
シェルスクリプト
ttps://www.apt-browse.org/browse/ubuntu/trusty/main/i386/debianutils/4.4/file/usr/bin/savelog
マニュアルページ
ttps://manpages.debian.org/jessie/debianutils/savelog.8.ja.html
名無しさん@お腹いっぱい。 [sage] 2017/11/02(木) 04:12:26.82
これ?
ttps://goo.gl/En6m3D
ttp://www.bityet.us/s7b47si.jpg
名無しさん@お腹いっぱい。 [sage] 2017/11/03(金) 04:26:36.66
X Windows System で,どの IMF が用いられているか判別する方法を考えている。
思い付いたのは $XMODIFIERS 環境変数を用いた
case $XMODIFIERS in
&#8195;&#8195;*ibus)
&#8195;&#8195;&#8195;&#8195;local _imf=ibus
&#8195;&#8195;&#8195;&#8195;;;
&#8195;&#8195;*fcitx)
&#8195;&#8195;&#8195;&#8195;local _imf=fcitx
&#8195;&#8195;&#8195;&#8195;;;
&#8195;&#8195;*uim)
&#8195;&#8195;&#8195;&#8195;local _imf=uim
&#8195;&#8195;&#8195;&#8195;;;
&#8195;&#8195;*SCIM)
&#8195;&#8195;&#8195;&#8195;local _imf=scim
&#8195;&#8195;&#8195;&#8195;;;
esac
なんだけど,$XMODIFIERS が必ず設定されているとは限らないし,なんか漏らしてる気がしてならん……。
名無しさん@お腹いっぱい。 [sage] 2017/11/03(金) 04:29:53.86
ツールで投稿したら空白がエラいことになった。すまん。
名無しさん@お腹いっぱい。 [sage] 2017/11/03(金) 07:20:14.85
Shell Scriptのコメントアウトに
# @(#) Foo is foo.
みたいな文字を書いておいて
$ what ./foo.sh
とやると
Foo is foo
という表示がでるというようなwhatコマンドがあるらしいのですが
手元のFedora26に見付かりません。($ dnf search what, $ dnf provides what)
どこかにありますでしょうか。
名無しさん@お腹いっぱい。 [sage] 2017/11/03(金) 08:32:21.55
Linuxの質問はLinux板で
名無しさん@お腹いっぱい。 [sage] 2017/11/03(金) 10:09:39.61

whatはかつて使われていたSCCSというソースコード管理システムに入っていたコマンド
現在はGNU CSSCがSCCSと同等の機能を提供している
なのでcsscというパッケージを探す
なければttps://www.gnu.org/software/cssc/へGO!
名無しさん@お腹いっぱい。 [sage] 2017/11/20(月) 15:39:18.57
case文で

$1がhogeで、$2がhageの場合のみ処理Aを実行する

みたいなのできないでしょうか?
名無しさん@お腹いっぱい。 [sage] 2017/11/20(月) 15:49:53.05
入れ子にすりゃいい
名無しさん@お腹いっぱい。 [sage] 2017/11/20(月) 15:56:36.27
$1にも$2にも含まれ得ない文字を区切りにして連結
名無しさん@お腹いっぱい。 [sage] 2017/11/20(月) 16:00:08.82

ありがとうございます。依存地獄に嵌ってしまいあきらめました,教えてもらったのにすいません。
また,御礼がおそくなってもうしわけないです。
名無しさん@お腹いっぱい。 [sage] 2017/11/20(月) 16:22:06.48
caseで実装するなら入れ子かね
しかしここでも髪の話するのか
名無しさん@お腹いっぱい。 [sage] 2017/11/20(月) 17:07:40.56




入れ子にできることを全然知らず
こんな感じかなでやってみたらいけました
皆さん短時間にありがとうございます


他意はありませんw
名無しさん@お腹いっぱい。 [sage] 2017/11/20(月) 18:39:46.60

気にし過ぎだろ
さっさと剃れよ
名無しさん@お腹いっぱい。 [sage] 2017/12/02(土) 09:15:00.24
すみません、bashでタブ区切りのファイルを配列に取り込む際、空の列が詰めて格納されてしまいます
そうならない方法はあるのでしょうか

exec < file.tsv
while read LINE
do
ARRAY=(${LINE})
done
名無しさん@お腹いっぱい。 [sage] 2017/12/02(土) 10:11:05.91

変数の参照部分を引用符で囲むとか。
#!/bin/sh -

exec < file.tsv
while read LINE; do
ARRAY=("$LINE")
done
echo "$ARRAY"
IFS の値を空にするとか。
#!/bin/sh -

IFS=
exec < file.tsv
while read LINE; do
ARRAY=($LINE)
done
echo $ARRAY
名無しさん@お腹いっぱい。 [sage] 2017/12/02(土) 10:16:16.70
あ,5ch ってコード貼るのまずいんだっけ。しくったな。
まあこんなくだらないコードに著作権云々関係ないかw
名無しさん@お腹いっぱい。 [] 2017/12/02(土) 10:37:47.62

bash なら mapfile がある(別名 readarray)
-t オプションで各行末尾の改行を取除く

mapfile -t ARRAY <file.tsv
名無しさん@お腹いっぱい。 [sage] 2017/12/03(日) 07:15:44.68
早速検証してみます、ありがとうございます!
名無しさん@お腹いっぱい。 [sage] 2017/12/05(火) 08:37:43.17
検証した結果、IFSを改行のみにして読み込み、その文字列をCutで抜くで達成できました
こうしないと空文字の列が詰まってしまいました

IFS_BAK=IFS
IFS=$'&#165;n'
exec < file.tsv
while read LINE
do
echo "${LINE}" | cut -f1 >> tmp1.txt
echo "${LINE}" | cut -f2 >> tmp2.txt
done
IFS=IFS_BAK
名無しさん@お腹いっぱい。 [sage] 2017/12/05(火) 09:20:20.37

重箱の隅を突くようで悪いが,その書き方をするならシェバンは #!/usr/bin/bash
にしておけ。
$'string' は Bash の独自拡張だった気がする。
433 [] 2017/12/06(水) 10:04:48.53

今ごろ勘違いに気づいた
mapfileじゃ全然見当外れじゃないか…なんかごめん

たとえば
IFS=$'\t'
line="${IFS}b"
このとき
a=(${line})

a=("" "b")
となるのを期待しているのだけど、実際にはクオートしていないので
a=( b)
と同じことになって、先頭の「空の列」は残らない
かといってクオートしたら
a=("${line}")
これはタブ区切りで分割されることなく行全体がそのままになるので意味がない…

ということだよね
のようにファイルに書き出すだけなら、そうやってcutでやるのが扱いやすそうだけど

もしどうしても配列にする必要があるときは、こんな感じでどうだろう
ttps://ideone.com/uPfCwc
空だと消えてしまうなら空にならないよう何か入れとけばいいじゃない(配列にしてから取り除く)
という案
名無しさん@お腹いっぱい。 [sage] 2017/12/11(月) 05:34:31.40

回答が遅れてすみませんでした

なるほど…その手はいけるんですね
ありがとうございます、活用させていただきます
自分は今回縛りがあってbashだけでやっているのですが、可能なら他のスクリプトに任すべきかな…(´・ω・`)
名無しさん@お腹いっぱい。 [sage] 2017/12/14(木) 00:31:41.37
そこは「他のシェルに」じゃないか
名無しさん@お腹いっぱい。 [] 2017/12/29(金) 06:50:06.02
誰でも簡単にパソコン1台で稼げる方法など
参考までに、
⇒ 『宮本のゴウリエセレレ』 というブログで見ることができるらしいです。

グーグル検索⇒『宮本のゴウリエセレレ』

PPEE18BYYA
名無しさん@お腹いっぱい。 [] 2018/01/08(月) 17:53:30.81
はじめまして
早速で申し訳ないのですが、以下のシェルスクリプトでdoを含むコマンドが一切使用できません。理由と解決策を教えてください。

#!/bin/sh
dir=`dirname ${0}`
echo -n "探す拡張子="
read que
ans=$(find ${dir} -name *.${que} | awk -F/ '{print $NF}')
if [ -z "${ans}" ];then
echo "${que}は見つかりませんでした。\n終了します。"
exit
else
echo "${ans}"
fi
名無しさん@お腹いっぱい。 [] 2018/01/08(月) 17:59:26.22

すみません訂正します。
select文のみどこに書いてもSyntax error: "do" unexpectedというエラー出てしまいます。
名無しさん@お腹いっぱい。 [sage] 2018/01/08(月) 18:43:33.26
doが何のこと言ってるのかよくわからんが実行の仕方が間違ってんじゃね
まず問題がどこにあるかを明確に切り分けろ
名無しさん@お腹いっぱい。 [] 2018/01/08(月) 20:31:51.74

さっき書き直したのですが、改善しませんでした。
エラー内容はさっきと同じで、 Syntax error: "do" unexpectedです。
441でも、どこに記述しても変わらなかったため、問題の部分を消して使っていたので、doの部分を貼り忘れてました。すみませんでした。

#!/bin/sh
dir=`dirname ${0}`
echo -n "検索する拡張子:"
read que
while [ -z "${que}" ]
do #ここのdoは問題なし。
echo -n "拡張子を入力してください。\n検索する拡張子:"
read que
done
ans=$(find ${dir} -name *.${que} | awk -F/ '{print $NF}')
if [ -z "${ans}" ];then
echo "${que}は見つかりませんでした。\n終了します。"
exit
else
echo "${ans}"
fi
#============ここから問題の部分===========
select var in ${ans}終了
do
if [ ${var} = 終了 ];then
exit
fi
if [ ${que} = gz -o xz];then
tar -xf ${dir}${var}
fi
done
名無しさん@お腹いっぱい。 [sage] 2018/01/08(月) 20:59:27.67
xz ]やないの?

シンタックスエラーって出てるんだからまず自分を疑おう
名無しさん@お腹いっぱい。 [sage] 2018/01/08(月) 21:01:57.76
どこに貼ってもだめならselectの構文がなんかおかしいんじゃないの
名無しさん@お腹いっぱい。 [] 2018/01/08(月) 21:16:18.25

スペース入れても変わりませんでした。


構文がおかしい部分を自分では見つけられませんでした。
名無しさん@お腹いっぱい。 [sage] 2018/01/08(月) 21:41:13.34
do unexpectedなら直前の「${ans}終了」ちゃうんけ
名無しさん@お腹いっぱい。 [] 2018/01/08(月) 22:01:36.46

変数じゃなくしても、終了を消しても、別の変数に変えてもSyntax error: "do" unexpectedは消えませんでした。
名無しさん@お腹いっぱい。 [sage] 2018/01/08(月) 22:17:55.91
とりあえず「間違いなく動作する」select構文をまず単品で書け
ネットのコピペでも構わん。出来る限りシンプルなやつで
動いたならそれを少しずつ改造して動かしてを繰り返しつつお前の目的に近づけろ
名無しさん@お腹いっぱい。 [sage] 2018/01/08(月) 22:28:27.56
shでselectってできたっけ
名無しさん@お腹いっぱい。 [sage] 2018/01/08(月) 23:44:18.33
SC2039: In POSIX sh, select loops are undefined.
bashならとりあえず動く、#!/bin/bash にしとけば
名無しさん@お腹いっぱい。 [] 2018/01/08(月) 23:56:10.56

ありがとうございます。コピペ&作り直しでできました。


Ubuntuでやっていたのでできました。


書き換えました。


皆様ありがとうございました。
もしかしたら似たようなものがすでにあるかもしれませんが、とりあえずできたものをに貼っておきます。
名無しさん@お腹いっぱい。 [] 2018/01/08(月) 23:57:24.21
#!/bin/bash
PS3="入力してください:"
menu="曖昧 前方一致 後方一致 完全一致 拡張子"
echo "検索するディレクトリを入力してください
入力しなかった場合、このファイルがあるディレクトリを検索します。"
while [ -z "${dir}" ]
do
echo -n "ディレクトリ入力:"
read dir
if [ -e "${dir}" ];then
break
else
unset dir
echo "そのようなディレクトリはありません。"
fi
done
echo "検索方法を選択してください:"
に続く
名無しさん@お腹いっぱい。 [] 2018/01/08(月) 23:58:02.00
続き
select var in ${menu}
do
echo ["${var}"]で検索します。
echo -n "検索する単語を入力してください:"
read que
case "${var}" in
曖昧)
ans=$(find ${dir} -name *"${que}"*);;
前方一致)
ans=$(find ${dir} -name "${que}"*);;
後方一致)
ans=$(find ${dir} -name *"${que}");;
完全一致)
ans=$(find ${dir} -name "${que}");;
拡張子)
ans=$(find ${dir} -name *."${que}");;
esac
echo "${ans}"
exit
done
名無しさん@お腹いっぱい。 [sage] 2018/01/09(火) 07:32:28.94
正直見辛いしその程度なら一行コマンド打つんでいらないっす
名無しさん@お腹いっぱい。 [sage] 2018/01/09(火) 12:43:53.77
* が展開されてうまく動かなかった
名無しさん@お腹いっぱい。 [sage] 2018/01/09(火) 20:01:44.41
Linuxの話ならLinux板で聞いてください
名無しさん@お腹いっぱい。 [sage] 2018/01/10(水) 13:12:44.56
odコマンドって規定で行番号は付くは省略するわでほんとUNIX哲学的じゃねーな
xxdとかのほうが遥かに扱いやすいわ
名無しさん@お腹いっぱい。 [sage] 2018/01/10(水) 16:21:53.96
行番号ちゃうし
名無しさん@お腹いっぱい。 [sage] 2018/01/11(木) 12:57:39.11
od -An -v
名無しさん@お腹いっぱい。 [sage] 2018/01/13(土) 15:24:43.34
規定がっていう話でしょ
それと同じで ls も規定で勝手に表示を整えるのをやめてほしい。
Plan 9のlsは規定でls -1みたいな挙動らしいけど。
名無しさん@お腹いっぱい。 [sage] 2018/01/13(土) 15:30:27.80
規定なら従っといた方がいいじゃん
罰則あるかもしれんし
名無しさん@お腹いっぱい。 [sage] 2018/01/13(土) 15:31:53.68
それは規約じゃ
名無しさん@お腹いっぱい。 [sage] 2018/01/13(土) 19:01:27.06
default = 既定
名無しさん@お腹いっぱい。 [sage] 2018/01/13(土) 22:58:37.21
違反すると罰則あるのは規定じゃなくて規約だろって話
名無しさん@お腹いっぱい。 [sage] 2018/01/14(日) 10:57:30.90
だから「Default=規定」って書いたんじゃねーの?
規約じゃないって意味で。
名無しさん@お腹いっぱい。 [sage] 2018/01/14(日) 11:45:22.78
ワケワカメ
名無しさん@お腹いっぱい。 [sage] 2018/01/14(日) 15:52:04.52
なんだこの流れ
全員頭悪いの?
名無しさん@お腹いっぱい。 [sage] 2018/01/14(日) 16:00:17.68
流れ?
名無しさん@お腹いっぱい。 [sage] 2018/01/14(日) 16:20:16.87
全次郎?
名無しさん@お腹いっぱい。 [sage] 2018/01/14(日) 17:49:06.78
規約じゃなくて規定なら別に従う必要ないって話なだけじゃないのか
名無しさん@お腹いっぱい。 [sage] 2018/01/14(日) 17:50:28.44
default=既定≠規定
名無しさん@お腹いっぱい。 [sage] 2018/01/14(日) 19:12:18.41
の誤字をが茶化したのに理解されずにグダグダになった流れ
名無しさん@お腹いっぱい。 [sage] 2018/01/14(日) 19:28:08.33
すまん誤字に全く気付かなかった
名無しさん@お腹いっぱい。 [sage] 2018/01/14(日) 19:34:54.90
あーなるほどそういうことか。
普通に「既定」に脳内変換してたせいで意味不明な喧嘩に見えてたわ
名無しさん@お腹いっぱい。 [sage] 2018/01/15(月) 00:06:01.79
脳内変換てw馬鹿なだけやんかw
名無しさん@お腹いっぱい。 [sage] 2018/01/15(月) 08:02:47.35
すぐそうやって火種を撒く……
名無しさん@お腹いっぱい。 [sage] 2018/01/15(月) 22:28:34.05
$'\n' こういう $'何か' っていう書き方って bash 限定?
sh でもいける?
名無しさん@お腹いっぱい。 [sage] 2018/01/16(火) 12:48:12.73
bash限定
名無しさん@お腹いっぱい。 [age] 2018/01/16(火) 15:07:55.74
POSIX xargs
ttp://pubs.opengroup.org/onlinepubs/9699919799/utilities/xargs.html
には-0オプションがありませんが,どうにかしてxargsにナル文字区切りのデータを渡せませんかね。
もしくは xargs -0 がエラーになるOSをご存知でしたら教えて下さい。
FreeBSD, MacOS, Debian GNU/Linuxともにxargsに-0オプションはありました。
名無しさん@お腹いっぱい。 [sage] 2018/01/16(火) 16:09:39.07
Solarisとかあやしそうだね
名無しさん@お腹いっぱい。 [sage] 2018/01/17(水) 00:51:10.26

そうみたいね
ttps://unix.stackexchange.com/questions/67193/solaris-xargs-command-for-solaris
ttps://docs.oracle.com/cd/E19253-01/819-1210/6n3j74k03/index.html
481 [sage] 2018/01/17(水) 04:46:35.14


ありがとうございます。
ファイルパスに関するシェルスクリプトを作ろうとしており,
ファイル名に改行文字が含まれている場合を考慮してナル文字区切りでデータを扱いたかったのです。
が,もうそんな特殊なファイル名にしている側の責任ってことにします。
仕事だったらもうちょっと考えるところですが個人で扱うので自分が気をつければいいだけなんで。

リンク等ありがとうございました。
名無しさん@お腹いっぱい。 [sage] 2018/01/17(水) 08:37:13.99
ttp://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html
POSIXのfindには+終端もあるみたいだから、
用途によってはxargsを使わずに変なファイル名が扱えることもある。
例によってSolarisにはないが、POSIXに準拠してないということで切れる。
481 [sage] 2018/01/17(水) 09:45:47.24

ありがとうございます。

> 例によってSolarisにはないが、POSIXに準拠してないということで切れる。

恥かしながらSolaisってPOSIX準拠を謳っていないことを今知りました……
よくシステムコールAPIの説明で「SolaisまたはPOSIX」とありますが,
その真意をようやく掴めました。

---
awkのRSにナル文字を指定できればxargsの代替として使えるかもしれないと思ったんですが,
$ printf '%s\0%s\0%s' 'First' 'Second' 'Third' | awk -v RS="$(printf '\0')" '{ print $0 }'
みたいなことをやっても撥ねられる
(シェルがナル文字についての警告を出して,「FirstSecondThird」とだけ表示される)
のでやっぱりナル区切りを扱うのはやめておこうと思いました。
大人しく空白区切り・改行レコードで行きます。
481 [sage] 2018/01/17(水) 09:55:31.15
なんかこうすると上手く行った (ように見えます)。

$ printf '%s\0%s\0%s' 'First' 'Second' 'Third' | \
awk ' \
BEGIN {
RS="\0"
ORS="\n"
}
{
print
} \
'

なんでこれが良くて がだめなのか分からないのが怖いので結局ナル文字区切りはやめることにしました。
連投&スレ汚し失礼しました。
名無しさん@お腹いっぱい。 [sage] 2018/01/18(木) 11:41:43.86
sedでiフラグをdフラグと一緒に使うことはできないのでしょうか。
名無しさん@お腹いっぱい。 [sage] 2018/01/18(木) 11:44:10.00

sed
ttp://mevius.2ch.net/test/read.cgi/unix/1085730992/
名無しさん@お腹いっぱい。 [sage] 2018/01/18(木) 19:40:41.47

誘導ありがとうございます。一応の解決を見ました。
名無しさん@お腹いっぱい。 [sage] 2018/01/26(金) 00:50:46.41
hoge.sh <(cat hoge.txt fuga.txt piyo.txt)

### hoge.sh
#!/bin/bash
wc -l $1 # 正しい行数
wc -l $1 # なぜか0

おせーてエロいひと
名無しさん@お腹いっぱい。 [sage] 2018/01/26(金) 06:57:46.46

つ cat hoge.txt fuga.txt piyo.txt | (wc -l; wc -l)
名無しさん@お腹いっぱい。 [sage] 2018/02/01(木) 22:35:58.02
こういうhoge.shがあったとして
```
#!/bin/bash
set -x
for x in aa bb cc; do
echo $x
done
```
実行するとこうなる
```
$ bash hoge.sh
+ for x in aa bb cc
+ echo aa
aa
+ for x in aa bb cc
+ echo bb
bb
+ for x in aa bb cc
+ echo cc
cc
```
けどこうしたい(forやifが出力されないようにしたい)
```
$ bash hoge.sh
+ echo aa
aa
+ echo bb
bb
+ echo cc
cc
```
どうしたらいい?
名無しさん@お腹いっぱい。 [sage] 2018/02/01(木) 22:38:33.65
つづき。ためしにこうしてみた
```
#!/bin/bash
for x in aa bb cc; do
set -x
echo $x
set +x
done
```
実行したら set +x も表示された(これはいらない)
```
$ bash hoge.sh
+ echo aa
aa
+ set +x
+ echo bb
bb
+ set +x
+ echo cc
cc
+ set +x
```
名無しさん@お腹いっぱい。 [sage] 2018/02/01(木) 22:40:28.83
grep -vでもしたら
名無しさん@お腹いっぱい。 [sage] 2018/02/01(木) 23:21:30.45
echo $x
の前に
echo + echo $x
と記述する
名無しさん@お腹いっぱい。 [sage] 2018/02/01(木) 23:48:49.07
bashだからじゃね?
名無しさん@お腹いっぱい。 [sage] 2018/02/02(金) 01:26:01.46
fishてどう?
名無しさん@お腹いっぱい。 [sage] 2018/02/02(金) 01:47:58.90
$ cat hoge.sh
#!/bin/bash
for x in aa bb cc; do
(set -x
echo $x)
done

$ bash hoge.sh
+ echo aa
aa
+ echo bb
bb
+ echo cc
cc

なんつって
名無しさん@お腹いっぱい。 [sage] 2018/02/02(金) 08:54:06.42

> (set -x
> echo $x)
この方法でできました。ありがとうございます。
もっと簡潔に書けるといいのだけど。
名無しさん@お腹いっぱい。 [] 2018/02/08(木) 16:21:59.61
すんませんけど 今割り当て端末数からこんな感じでサブネットマスクを出すのを作ったんですけど
i=256;j=0 ; while [ ! $i -eq 1 ] ; do i=$(( $i /2 ));echo $i; j=$(($j + 1)) ; done ;echo ans:$((32 - $j))

もっとてっとり早く出すコマンドはありませんか? できれば256を入れたら8とかさっさと返してくれるような奴を
あとよくわからんけど 計算で256と2を入力したら後ろの8とかを出すコマンドはないですか?
覚えるとか調べるは嫌いなんで、なるべく手間のかからないものを教えてください
 
名無しさん@お腹いっぱい。 [sage] 2018/02/08(木) 17:19:18.65
サブネットマスクぐらい暗記か手計算しろよ
名無しさん@お腹いっぱい。 [sage] 2018/02/08(木) 18:06:11.03
>覚えるとか調べるは嫌いなんで、

生きてる意味あんのか、これで?
名無しさん@お腹いっぱい。 [] 2018/02/08(木) 19:05:19.51

手間がかかるから面倒だよ
20万以上やるし

ああ これででるのね うしろに変なゴミが付いてるがどうでもいいか
:echo " l(65556)/l(2)" | bc -l
16.00044020841915062248
:echo " l(1024)/l(2)" | bc -l
10.00000000000000000010

また努力するするのが誇らしいとか思ってる馬鹿?ww
俺が考えるならこの機械とか利用価値はないよ
ゲーム開発のUNITYのスレに行けば似たような奴が沢山いるよ

まぁしばらくはマシーンを買う金がないからlinuxとイヤイヤ付き合うしかないが
ほんと手間がかかるな
名無しさん@お腹いっぱい。 [sage] 2018/02/08(木) 19:20:30.57
ある意味面白いやつだな
名無しさん@お腹いっぱい。 [sage] 2018/02/08(木) 20:11:48.67
>また努力するするのが誇らしいとか思ってる馬鹿?ww

こんなこと考えたこともないけど
思い込みが激しいっていうか頭腐ってるだろ
ああ死んでるんだったっけ
名無しさん@お腹いっぱい。 [sage] 2018/02/08(木) 20:31:31.63
落ち着け
名無しさん@お腹いっぱい。 [] 2018/02/08(木) 20:57:59.75

そういう手間が掛かるのはちょっと…
利用価値がないし
名無しさん@お腹いっぱい。 [] 2018/02/08(木) 21:47:56.46
バイト雇って計算してもらいましょう
名無しさん@お腹いっぱい。 [] 2018/02/08(木) 23:17:47.05

俺自体が無職だよ

さて間抜けからビットコインを盗まんと
名無しさん@お腹いっぱい。 [sage] 2018/02/09(金) 01:51:26.42

頼むわ
間抜けは存在自体がガンだから
名無しさん@お腹いっぱい。 [sage] 2018/02/09(金) 09:19:26.94
犯罪の予告と教唆かよ
名無しさん@お腹いっぱい。 [] 2018/02/09(金) 22:09:51.06

予告と教唆じゃなくて実行中だよ
とろくさいやつだなw
ttp://or2.mobi/index.php?mode=image&file=193749.jpg
ttp://or2.mobi/index.php?mode=image&file=193750.jpg

3週間たってだいぶリナックスにも慣れてきた
ある程度稼がせてもらったらウインドウズに戻るよ
ライブは少し使いにくい
名無しさん@お腹いっぱい。 [] 2018/02/09(金) 22:12:54.21
なんかシェルスクリプト総合とか書いてあったから来てみたけど
しょぼそうな連中しか居ないけど…

ここのひとってシステム管理とかで食ってる連中が多いの?
名無しさん@お腹いっぱい。 [sage] 2018/02/09(金) 22:39:19.88
煽ったらなんかもらえるのか?
名無しさん@お腹いっぱい。 [sage] 2018/02/09(金) 22:54:21.43
なんか急に変なの出てきたな
どっかにスレのアドレスでも貼られたのか
名無しさん@お腹いっぱい。 [sage] 2018/02/10(土) 00:05:29.76
いや元々お前らの方がずっと変だけどw
名無しさん@お腹いっぱい。 [sage] 2018/02/10(土) 05:51:23.70
変と思いながら見続けて今さあながら「変だ!変だ!」と言う人って・・・

まあ相手にされるかは別にして居たいなら居ていいと思うよ
名無しさん@お腹いっぱい。 [] 2018/02/10(土) 11:31:48.71

面白いネタがあれば食いつくんじゃない?
つまらんネタしか無いから過疎ってる。
名無しさん@お腹いっぱい。 [] 2018/02/10(土) 19:55:51.78
ほんとに揃いも揃っておまえらは無能な連中だよ
こんな能無し共が良いかねを取って裕福な生活をしてるのに
何で俺がしこしこビットコインを盗まんとならんのか……
よしよしw 今日はあがりはデカそうだな
名無しさん@お腹いっぱい。 [sage] 2018/02/15(木) 20:16:20.69
1111
2222
3333
という内容のファイルに対して,
• 3333 が見付かれば 3333 を,
• 見付からなければ 2222 を
• ⋮
という操作を施したいです。そして,これをパイプに繋ぎたいです。
私が考えたのは↓のスクリプトですが,
for q in 3333 2222 1111; do
cat <<-'EOF' |
1111
2222
3333
EOF
grep $q && break
done
難点があります。
1. パイプでファイルを渡せない。
2. 順番に依存している (実際のファイルでは 3333 が最後にくるとは限らない)
どうか助言願います
名無しさん@お腹いっぱい。 [sage] 2018/02/15(木) 20:19:41.66
あ,すいません。期待する動作は,
かりに理想のスクリプトを idea.sh として,
$ cat ./org.txt
2222
3333
1111
$ cat ./org.txt | idea.sh
3333
$ cat ./org.txt | sed -e '/3333/d' | idea.sh
2222
$ cat ./org.txt | sed -e '/3333/d' -e '/2222/d' | idea.sh
1111
という感じです。
名無しさん@お腹いっぱい。 [sage] 2018/02/15(木) 21:01:11.15
標準入力を受け取れるように作ればいいんじゃないの?

idea.sh
sed -e "/$1/d" < /dev/stdin

$ cat ./org.txt | ./idea.sh ‘3333’ | ./idea.sh ‘2222’ | ./idea.sh ‘1111’
名無しさん@お腹いっぱい。 [sage] 2018/02/15(木) 21:10:36.33
awk使うのが妥当。
awkが嫌なら、標準入力をファイルにコピーしてから複数回に分けて処理するしかないな。
名無しさん@お腹いっぱい。 [sage] 2018/02/15(木) 21:26:45.83
やりたい事はシンプルなのに標準入力使おうとしてるせいで妙に面倒になってるな
awkかgrepでよさそうだが
名無しさん@お腹いっぱい。 [] 2018/02/15(木) 21:36:30.68
事前にソートしたら?
名無しさん@お腹いっぱい。 [sage] 2018/02/15(木) 21:38:59.09
tacは?
名無しさん@お腹いっぱい。 [] 2018/02/15(木) 21:41:36.03
$PATHの中身って最初は空じゃないの?
$PATHをechoしてみたら,その中に
~/.bashrcや~/.bash_profileでexportされてるパス以外のモノが含まれてた
でも$PATHに初期値を設定できるならわざわざ~/.bashrcや~/.bash_profileでexportする必要なくない?
どうなってるのか教えてくれ
名無しさん@お腹いっぱい。 [sage] 2018/02/15(木) 22:34:13.00
OSによるけどinit.dの中とかlogin.confとかでデフォルトを設定する。
ここ書き換えると全ユーザに影響が出るので、個別設定は.bash_profileとかに書く。
exportするのは万一PATHなしで起動されてしまったとき用。
名無しさん@お腹いっぱい。 [] 2018/02/16(金) 02:23:59.63

> すんませんけど 今割り当て端末数からこんな感じでサブネットマスクを出すのを作ったんですけど

ipcalcコマンドで行けるんじゃね?
知ってるだけで使ったことないけど

他にもiptabとかipcountとかあるらしいな
名無しさん@お腹いっぱい。 [] 2018/02/16(金) 08:44:35.62

最初に自身で書いてたようなんで十分じゃないの?
パイプで渡せないというのが何を嫌がってんのかによるけど
テキストなら貯めてechoしたっていいんじゃ
DATA="$(cat -)" && cat $KEYWORDFILE | while read KEYWORD ; do ( echo "$DATA" | grep "$KEYWORD" ) && break ; done

データでかいから捜査対象の方を1パスで捜査したいってことなら
シェルスクリプトでがんばるより別のことでがんばろう
名無しさん@お腹いっぱい。 [] 2018/02/16(金) 20:37:24.42

ありがとやっと有益なレスが出たよ
他のやつは揃いも揃って無能な役立たずばっかりだから
名無しさん@お腹いっぱい。 [] 2018/02/16(金) 20:41:32.04
ショッアーーーーーーーーー!!!
さってビットコインを盗むか
名無しさん@お腹いっぱい。 [] 2018/02/16(金) 21:23:29.93
アホにレスした俺もアホだった。
やっぱアホはスルーに限る。
名無しさん@お腹いっぱい。 [sage] 2018/02/17(土) 02:29:48.74

俺も普通は ipcalc 使ってるけど最近は sipcalc というのもあるらしい。

紹介してくれてる iptab とか ipcount 含めて今度試してみようと思う
名無しさん@お腹いっぱい。 [sage] 2018/02/20(火) 18:16:48.11
シェルスクリプトの函数で扱える文字数に上限はないのでしょうか。
ttp://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_05
↑ここが多分公式の文書だと思うのですが,使用可能な文字の種類に言及こそすれ,文字数については触れていないように思いますが……
ファイル名などの上限と同じく255文字でしょうか?
名無しさん@お腹いっぱい。 [sage] 2018/02/22(木) 02:57:44.82

255文字かどうかは、質問するまでもなくすぐにわかると思いますよ。
名無しさん@お腹いっぱい。 [sage] 2018/02/22(木) 05:46:35.30
ワロタ、試せよwそして調べろよって話だよな
名無しさん@お腹いっぱい。 [sage] 2018/02/24(土) 22:51:48.88
$ :> "$(yes a | head -n 255 | tr -d '\n')"
$ :> "$(yes a | head -n 256 | tr -d '\n')"
sh: 1: cannot create aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: File name too long
名無しさん@お腹いっぱい。 [sage] 2018/02/25(日) 16:39:26.69
ファイル名の文字数上限はファイルシステムに依存する
名無しさん@お腹いっぱい。 [] 2018/03/03(土) 23:53:36.62
シェルスクリプトで有るコマンドを実行した時、
標準出力の内容を緑に、標準エラー出力の内容を
赤にしたいんだけどどうすればいい?

本当に聞きたいことはエスケープシーケンスではなく、
標準出力と標準エラーをそれぞれ別々に加工する方法ね
名無しさん@お腹いっぱい。 [sage] 2018/03/03(土) 23:53:52.11
ちなみにファイルに吐き出さずにやりたい
名無しさん@お腹いっぱい。 [sage] 2018/03/04(日) 01:26:00.19
お前にはなんか教えたくない
名無しさん@お腹いっぱい。 [sage] 2018/03/04(日) 01:40:31.82
なんかググればすぐ出てきそうな
名無しさん@お腹いっぱい。 [sage] 2018/03/04(日) 02:21:55.51
それがないんだよね。標準エラー出力を標準出力に
変えてしまうのは有るけど、それじゃ別々にやるのは不可能だし
名無しさん@お腹いっぱい。 [sage] 2018/03/04(日) 16:46:18.09
条件が厳しいからどうしてもシェルスクリプトでやりたいなら
先ずシェルを作るところから始めないといけない
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 00:43:32.66
bashやzshなら簡単に出来るぞ
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 01:06:07.74
出力を切り離してパイプで別々のコマンドでフィルタする程度じゃ全然駄目だから
こういうのを簡単にできると言い切る人はきっとものすごく優秀な頭脳の持ち主だと思う
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 01:28:58.62
これは書いていなかった俺が悪いんだが、
bashやzshを使わずにposixの範囲でやりたいんだよね。
少なくともdashやashで動くものがほしい

でその方法が実際にあることは知ってるんだけど、
もっとシンプルな方法はないのだろうかと言うのと
俺がその方法をここに書いちゃうと
身バレしちゃうので書かなかった
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 12:24:32.78

> 出力を切り離してパイプで別々のコマンドでフィルタする
だけやぞ
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 18:09:38.99
POSIXに準拠したい気持は分かるけど,一次ファイルを作らないっていう謎の拘りが理解できない。
両立させるのは厳しいと思う。もうさ,
tempf="$(printf '%s%s%s%s' '/tmp/' "$(date +"%y%m%d%H%M%S")" '.' "$$")"; somecmd 2> "${tempf}" | \
printf '\e[1;32m%s\e[0m\n\e[1;31m%s\e[0m\n' "$(cat)" "$(cat "${tempf}")"; rm -rf "${tempf}"
でいいでしょ。もちろんPOSIX準拠。

あと偉そうなこと言うが,「身バレが怖いから持ってる (有益かもしれない) 情報を明かしません」って,
こっちからするとかなり不快だから,黙って何も知らないふりをしておいたほうがまだマシだよ。
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 18:12:03.21
落ち着け
最初の質問の時点で性格の幼稚さは見え透いてるだろ
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 19:58:23.46

やり方教えて
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 21:20:34.93

> 一次ファイルを作らないっていう謎の拘りが理解できない。
書いてなかったのが悪いんだろうけど、一時ファイルを使うと
ストリーミングで処理できなくなるんだよ
つまり前のプログラムの出力が完了しないと次のプログラムが動かない
POSIX準拠はbusyboxで動かす必要があるからこれも必須
この二点は今回の質問には直接関係ないから理由じゃなくて制約として書いた
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 21:25:58.36
そしてこっちの方で回答きたよ

くだらねえ質問はここに書き込め!Part 230
ttps://mao.5ch.net/test/read.cgi/linux/1515383155/315

同じ文章なのになんでこう反応が違うんだろうね
同じ文章なんだからレスする側の問題があるだろうね
質問する側と回答する側、立場は対等だって言ったら怒りそう
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 21:38:48.22

あとmktemp使ったほうが良いよ。
なんでぜったいにかぶらない方法があるのに
自分でなるべくかぶらないように努力するんだろう
結構多いよね。mktemp使ったほうがコード短くなるのに
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 21:48:54.27
自分自身は何もしてないのになぜこうも態度をでかくできるのか
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 21:57:02.07
別にでかくないでしょw ほかの人と一緒。
質問したからといってへりくだる必要はないと思ってるだけ
無知でもないしね
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 22:10:47.74
マルチカスか
教えたがりを徹底的にこき使っとけ
ここには二度とくるなよ
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 22:45:20.19
少なくとも聞く側の態度じゃぁないな
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 22:54:52.33
聞く側はこういう態度を取らないといけないって
体育会系とか年功序列とか年上は敬え的な考え方だよ
今時はやらない
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 23:15:38.51
545から漂う頭の悪さよ
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 23:21:32.35
のそれ「解答」じゃないじゃん。
無理って言われてるんだぞ? 理解できてる?
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 23:23:14.97
もういいじゃん
ほっとけよ
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 23:23:16.19
どういう態度取るべきとは思わないけど、
相手を不快にさせたら得られるはずの回答も得られなくなる可能性が上がるよ。
それでよければご自由に。
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 23:26:33.25
出力が色制御してきたら取り除いたりとか、マルチプロセスとかで変なところでブッタ斬り/ミックスされないように同期取ったりとか考えてたけど俺には無理だからもういいや
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 23:33:38.33


やりたいこと

> 標準出力の内容を緑に、標準エラー出力の内容を
> 赤にしたいんだけどどうすればいい?

標準出力の内容を緑にする・・・簡単
標準エラー出力の内容を赤にする・・・?

で明らかになったこと ・・・ 標準出力と標準エラー出力を入れ替える方法

ここから標準エラー出力の内容を赤にするには
標準出力と標準エラー出力を入れ替えれて
処理すればいいって気づくよね?
名無しさん@お腹いっぱい。 [sage] 2018/03/05(月) 23:47:07.49

ん?
それだと今度は標準出力が (標準エラー出力に複製されたので) パイプを通らなくなるから、
標準出力の内容 (今は標準エラー出力に出力されている) を緑にできないんじゃ?

もしかして同時じゃなくていいってこと?
名無しさん@お腹いっぱい。 [sage] 2018/03/06(火) 00:20:35.13
もうほっとけ

標準出力、標準エラー出力に関する便利な小ネタでも教えてやろうかと思ったけどやめとくわ
名無しさん@お腹いっぱい。 [sage] 2018/03/06(火) 01:01:07.43

片方ずつしか処理できないなら、
2回やれば両方できるだろ?
っていうかそれぐらいわかるだろw
名無しさん@お腹いっぱい。 [sage] 2018/03/06(火) 01:01:45.64

> 標準出力、標準エラー出力に関する便利な小ネタでも教えてやろうかと思ったけどやめとくわ

おせーておせーて
名無しさん@お腹いっぱい。 [sage] 2018/03/06(火) 01:03:40.69
|& ←このパイプは標準出力標準エラー出力ともに通すよ。
ただ質問者さんが望んでいるのは「標準出力か標準出力かが区別できる状態でのパイプ通過」だろうから、
それはちょっと無理なんじゃないかな。

あと態度がデカすぎる。一度死​んだほうがいいと思う。
名無しさん@お腹いっぱい。 [sage] 2018/03/06(火) 01:14:26.43
まさかコマンド二回回すの? 標準出力と標準エラー出力分ける為だけに?
それ一時ファイル作るより余程冗長だぞw
もう一度シェルっていうかコンピュータの仕組みを勉強しなおしてきな
名無しさん@お腹いっぱい。 [sage] 2018/03/06(火) 01:45:01.59
だから一時ファイルを作るとストリーミングに
できなくなるからだめなんだって
さっきも書いたろ
名無しさん@お腹いっぱい。 [sage] 2018/03/06(火) 01:47:17.52

やっぱりが今のところ一番シンプルな解みたいだね。
てか、標準出力と標準エラー出力を別々にファイルに吐き出せるんだから、
別々のプログラムにパイプでつなげられる機能があっても良いと思うんだけどね
名無しさん@お腹いっぱい。 [sage] 2018/03/06(火) 02:48:45.93
君たぶんだけど意思疎通に係わる障害持ってるから病院で診てもらったほうがいいよ。
知り合いにそういう調子の会話する人がいて、ある日会社で大きな事件を起こして辞めさせられたあと
病院で検査したらそういう系統の精神病だったからさ。
煽りとかじゃなくて、君はどうも社会で孤立してそうだから、助けになりたい。
名無しさん@お腹いっぱい。 [sage] 2018/03/06(火) 03:23:52.46
いや、おちょくってるだけだろ
まともに相手するだけ無駄やぞ
名無しさん@お腹いっぱい。 [sage] 2018/03/06(火) 04:17:47.54
ここに限らず、質問系のスレにたまに沸くアレでしょ
5chが過疎って最近あんま見てなかったから
なんか懐かしい感じするわw
名無しさん@お腹いっぱい。 [sage] 2018/03/06(火) 10:26:50.47
レス内容が煽りだけになったらおしまいw
名無しさん@お腹いっぱい。 [sage] 2018/03/06(火) 20:25:23.40
あっちで粘着してるみたいだな
久々にアレな奴を見たわ
名無しさん@お腹いっぱい。 [sage] 2018/03/06(火) 21:23:37.44
入力リダイレクトで複数ファイルを一度で流し込むのはどうしたら良いのですか?
名無しさん@お腹いっぱい。 [sage] 2018/03/06(火) 21:44:48.81
catしてパイプ
watarie [] 2018/03/06(火) 22:03:33.11
よろしくお願いします。
mac で bashです。 mdfindからパイプつないだ先でcpしたら

検索が間に合わなかったのかコピーし損ねがでてきます。
再度コピーしそこねたファイル名リストを同じようにこれに掛けると、
幾つか成功していくつかはコピーし損ねます。

function readMdfind() {
while read LINE;
do
mdfind "kMDItemFSName == "${LINE}" || kMDItemDisplayName == "${LINE%.*}"" | awk 'NR==1' | xargs -J % cp -p "%" "$1" 2>/dev/null
done <${2}

引数の1はファイル名のリストが入ったテキストで、2はコピー先のフォルダになります。
ファイル名は殆どが一意にしてあるので、とりあえずヒットしたら良い感じです。
一度で取りこぼしのない良い方法はありませんでしょうか。
watarie [] 2018/03/06(火) 22:05:40.25
引数の件1と2逆でした 惑わせてしまい申し訳ありません。
正しくは1がコピー先フォルダで2がファイル名のリストです。
名無しさん@お腹いっぱい。 [sage] 2018/03/06(火) 22:33:41.80

回答ありがとうございます。

ということはそのまま
cat hoge huga | command
で、いいってことですか。なるほど。

レスつくまで色々ググって調べてみたのですが
command <( cat hoge huga )
でも全く同じ動作ですか?
名無しさん@お腹いっぱい。 [sage] 2018/03/06(火) 23:27:44.61

二番目の方法,たぶんコマンドラインで試して成功したから書き込んでるんだろうけど,
それはプロセス置換と言って Bash筆頭に幾つかのシェルの独自拡張だからシェルスクリプトにするときは
シェバンを #! /usr/bin/env bash か #! /bin/bash とかにする必要がある。
cat hoge huga | somecommand で代替できることに可搬性を犠牲にするのは避けたいだろうから
(つまり #! /bin/sh というシェバンを捨てるのは勿体無いということ)
<(cat hoge huga) は避けれる時は (特にシェルスクリプトで使う時) 避けといたほうがいいんじゃないかな。
586 [sage] 2018/03/06(火) 23:29:38.39
5行目あたりの日本語がおかしい。けど国語力ないので自然に直すの無理。
察してくれ。
名無しさん@お腹いっぱい。 [sage] 2018/03/06(火) 23:43:28.43

なるほど!
#!/bin/sh が必ずbashにリンクされてるとは限らないから、
拡張表現で書かなくて済む場合は確かに可搬性を優先した方がいいですね。

ありがとうございました。
名無しさん@お腹いっぱい。 [sage] 2018/03/06(火) 23:49:32.51

mdfindを知らんので問題解決に直接ならないけれど`done < ${2}`ではなく`done < "$2"`のほうがいいよ〜
もっと言うなら`cat "$2" | while read LINE;`のほうがいいかもね〜
* POSIX sh互換シェルは変数名に数字が来たらそこで読み取りを中断するので波括弧で変数名の範囲を明示しなくていい
* 変数$LINEに^Dとかが渡された時catコマンドと<リダイレクトで違いがある
短いんだけど参考: ttp://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_01
588 [sage] 2018/03/06(火) 23:58:01.42
あー!
さらに調べたら、よくわかりました。
#!/bin/sh でbashを起動したらbashの拡張とか使えなくなっちゃうんですね。
だからシェバンを書き換える必要があると…
そういう意味だったんですね。
(ちゃんとmanにかいてありました)

ためになりました。
名無しさん@お腹いっぱい。 [] 2018/03/07(水) 07:20:57.39

ん?どゆこと?
$ cat file | cmd
$ cmd < file
で違いがあるってこと?そうは思えないんだけど…
名無しさん@お腹いっぱい。 [sage] 2018/03/07(水) 08:34:45.43
$LINEに^Dってなんぞやってところだな
名無しさん@お腹いっぱい。 [sage] 2018/03/07(水) 08:37:52.19

まずはエラーをnullに落とさずに表示させろ
watarie [] 2018/03/07(水) 09:23:48.67
さん
watarie [] 2018/03/07(水) 09:32:33.42
さん
ありがとうございます。ちょっと英語で読解が難しいので時間を作って該当の箇所を読ませていただこうかと思います。
{2}の箇所を"2"に変更しました。
<の箇所をcatに変更しました。
非常に目に優しいくなりました。
読み込む箇所なので、怪しいと感じます。結果としては変わりませんでしたが、参照の箇所は興味がありますので読ませていただこうと思っています。英語で弱気になりますが^^;
ありがとうございます。
watarie [] 2018/03/07(水) 09:37:28.43
さん
すみません。確かにそうですよね。
初心者過ぎで逃げを当然にしてたバチがあたったようです。
吐き出したエラーは、
cp: /Volumes/Macintosh: No such file or directory
cp: HD: No such file or directory
などのファイルパスが、スペース区切りになってcp出来ませんでしたよというエラーでした。
ただ、検索に漏れた該当のファイルは何度めかにはヒットしますので上記のエラーとはならなかったということに。
spotlight特有のものだからと諦めるしかないのか・・・

これがひょっとしたら手がかりになるかもしれませんが、わたしの力では全く・・・
watarie [] 2018/03/07(水) 09:45:34.86
すみません、mdfindの検索結果のファイルパスが
スペースで割れてしまってcpに渡されたということでした。たぶん^^;
watarie [] 2018/03/07(水) 12:55:37.74
解けました!ありがとうございます!
ダブルコーテーションを%の箇所で囲うのではなく、
1行取り出した先でパイプして囲えば良いと思い以下を試したところ出来ました。
mdfind "kMDItemFSName == "${LINE}" || kMDItemDisplayName == "${LINE%.*}"" | awk 'NR==1' | sed -e 's/^\(.*\)$/\"\1\"/' | xargs -J % cp -p % "$1" 2>/Users/mac10/Desktop/out
エラー出力素晴らしいです!
ありがとうございました!
名無しさん@お腹いっぱい。 [sage] 2018/03/07(水) 18:25:56.09
ずっとageっぱなし…(小声)
名無しさん@お腹いっぱい。 [sage] 2018/03/07(水) 19:48:17.38
mdfindとxargsに-0つけるのが定石だと思うけど、もう見てないかな。
名無しさん@お腹いっぱい。 [] 2018/03/08(木) 00:41:50.66

今更だけど、あるんだよね。誰も教えたくなかったんだね。
名無しさん@お腹いっぱい。 [sage] 2018/03/08(木) 01:55:58.38
まああるよね
名無しさん@お腹いっぱい。 [sage] 2018/03/08(木) 07:30:07.37
ヒントくらい出すか……。でもあいつに教えたくないんだよなぁ。
卑屈だけど、気持は分かるだろ?
パイプに名前(ry
名無しさん@お腹いっぱい。 [sage] 2018/03/08(木) 16:44:02.99
それ使うと出力側はこんな感じかな
while :;do sed -e 's/\(.*\)/^[[32m\1^[[m/' np1 & sed -e 's/\(.*\)/^[[33m\1^[[m/' np2 >&2; done
名無しさん@お腹いっぱい。 [sage] 2018/03/08(木) 20:31:17.47

野暮な指摘だが、sedを使わない
printf '\e[32m%s\[0m' "$(cat)"
の方が分かりやすくね? つーか printf ってそういう「整形した出力」の為のコマンドだろうし。
604 [sage] 2018/03/08(木) 20:32:49.31

ミスった… printf '\e[32m%s\e[0m' "$(cat)" だ。
こうすると "$(cat)" の部分で np1 を受けt[以下略]
名無しさん@お腹いっぱい。 [sage] 2018/03/08(木) 20:51:46.21

名前付きパイプ(mkfifo)はプロセスが2個あって
片方が出力側プロセス、片方側が入力側プロセスに
別れない限りストリーミングにすることができない
(同一プロセスでは出力しながら入力ができないため)

今回の場合、標準出力と標準エラー出力の2つがあるから
出力側プロセス1個と入力側プロセス2個の合計3プロセスが必要になる
つまり別プロセスとして起動しなければいけない

もちろん出力の完了待ちのwaitも必要だし、作成したパイプの削除も必要。
特にCTRL+Cで中断された場合とか
また万全を期してパイプ名が被ることも考慮してランダムな名前にしたい

ここまで言えば名前付きパイプを使った方法は実装するのに行数がかかり
面倒な方法だと言うことがわかるだろう?

またで書いたとおりbusyboxで動かす必要があるのだが、
そもそもbusyboxでmkfifoが存在しない場合もある
↑俺にとってはこっちのほうが重要
名無しさん@お腹いっぱい。 [sage] 2018/03/08(木) 21:00:55.81
もう来なくていいよ
レス続けるならコテハン付けて
名無しさん@お腹いっぱい。 [sage] 2018/03/08(木) 21:03:28.88
粘着かよ
気持ち悪い
名無しさん@お腹いっぱい。 [sage] 2018/03/08(木) 21:03:48.79
レス続けたのは俺じゃないんだがw
名無しさん@お腹いっぱい。 [sage] 2018/03/08(木) 21:57:56.36
うわ。まだ居たのかこのキ​チガイ…
まあ放置が一番いいな。俺のこのレスも彼を発狂させる原因になるやもしれんし。
名無しさん@お腹いっぱい。 [sage] 2018/03/08(木) 22:15:10.19
まあ反論なく放置される(=俺の勝ち逃げ)という状況ってのが
俺にとっては一番であることには間違いないが


で俺がレスしたのは、放置してないからだよ?w
604 [sage] 2018/03/08(木) 22:33:08.10

あ、しまった printf '\e' は GNU/Linux じゃないと動かないみたい。
Debian使ってんのがバレてしまったw
FreeBSDとかでも動作させる為には printf '\033' とやる必要がある。
名無しさん@お腹いっぱい。 [sage] 2018/03/08(木) 22:42:34.38

出力 A 正常 出力 B 異常 出力 C 正常 の時
それだとACBまたはBACと表示されないか?
まぁそれで良ければ良いんだけど
名無しさん@お腹いっぱい。 [sage] 2018/03/08(木) 23:32:13.81
ガチでアレな奴が粘着してるな
ここまで気持ち悪い奴は滅多に見ない
名無しさん@お腹いっぱい。 [sage] 2018/03/08(木) 23:54:18.50

exec > >(sed -e 's/\(.*\)/^[[32m\1^[[m/')
exec 2> >(sed -e 's/\(.*\)/^[[33m\1^[[m/')

後は普通に処理を書けばおk
名無しさん@お腹いっぱい。 [sage] 2018/03/09(金) 01:48:35.86
どんだけ答え知りたいんだ
あっちのスレいけよこっちはこっちで楽しんでんだから
名無しさん@お腹いっぱい。 [sage] 2018/03/09(金) 22:50:21.96
おいおい勘違いするな
はbashやzshでのやり方を聞いてる。
POSIXの範囲でやりたいと言ってる俺ではない
名無しさん@お腹いっぱい。 [sage] 2018/03/09(金) 23:00:06.75
そういやで思い出したけど、
busyboxのsedってなんか動きがおかしいんだよね。

(echo 1; sleep 5; echo 2; sleep 5) | sed 's/a/a/'

例えばこれを実行すると、1が表示されるのは5秒後になる
debianだとすぐに表示されるのに。一行遅れて表示される

だからsedは今回の俺の用途には使えなくてreadを使ってる
名無しさん@お腹いっぱい。 [sage] 2018/03/10(土) 00:28:42.71

Ubuntu ではおかしいみたいですね。
Debian と openSUSE の busybox では記述通りの動きでした。
名無しさん@お腹いっぱい。 [sage] 2018/03/10(土) 01:03:52.34

WSL上のUbuntuは問題なかった。
busyboxはビルドによって色々変わるだろうけど
よく分からんね
名無しさん@お腹いっぱい。 [sage] 2018/03/10(土) 01:06:54.08
> openSUSE の busybox では記述通りの動きでした。
もしかして、sedはbusyboxじゃない方のsedになってない?

WSL上のUbuntuに入れたbusyboxのsed
↓つまりこれを実行するとやっぱり5秒後に1と表示される
(echo 1; sleep 5; echo 2; sleep 5) | busybox sed 's/a/a/'

やっぱりbusyboxが実装してる簡易版sedの問題な気がする
名無しさん@お腹いっぱい。 [sage] 2018/03/10(土) 01:08:10.50
まあもともとbusyboxってそういうものだし
とりわけ騒いだりはしないけどさ
名無しさん@お腹いっぱい。 [sage] 2018/03/10(土) 02:15:25.24

は busybox ash でシェルを起動して確認しています。
busybox sed 's/a/a/' にすると Debian も openSUSE も Ubuntu と同じ動作になりました。
名無しさん@お腹いっぱい。 [sage] 2018/03/10(土) 09:07:03.16
おーほんとだ。Busybox v1.22.1 on Debianでも同じような動きになる。
ここまでハッキリしたバグに遭遇したの久し振りだわ
単に離れてただけかもしれんが
名無しさん@お腹いっぱい。 [sage] 2018/03/10(土) 09:38:16.90
なにやら興味がある人がいるようでw

なんで俺の用途で使えないかというと、例えばこんな感じに
ユーザーのインタラクティブな入力を変換して出力したいから

↓ >(実際には画面に表示されない) の行がユーザーの入力

$ sh | sed 's/a/a/'
> echo 1
> echo 2
1
> echo 3
2

見ての通りユーザーが入力したコマンドの結果が一つ遅れて表示される
sedのよくあるユースケースでは問題ないんだろうけどね
名無しさん@お腹いっぱい。 [sage] 2018/03/10(土) 12:15:21.67

挙動が変わるツールは珍しいなと思いました。
busybox ash の中で sh | sed 's/a/a/' とすると、
Debian (v1.22.1) まとも
Ubuntu (v1.22.1) 遅れる
openSUSE (v1.21.1) まとも(sh プロンプトが表示される)
CentOS (v1.15.1) まとも(sh プロンプトが表示される)
Windows (v1.29.0) 遅れる
でした。
ビルド時に引いているライブラリの差異なのでしょうか...
名無しさん@お腹いっぱい。 [sage] 2018/03/10(土) 12:28:15.59
バッファリングが影響してそうなのかもしれないけど
正規表現の実装の都合な気もする。
はたまたカーネルが関係してるのかシェルの設定でなんかあるのか

正直、そういう違いが有るんだね。気をつけておくよと
事実を受け止めるぐらいでで深追いする気力はないw

話変わるけど、何もしない関数の定義、
foo() :

もしくは、echoするだけの関数の定義
foo(): echo foo

この書き方ってPOSIX準拠だよね?
bashやzshではエラーになった
名無しさん@お腹いっぱい。 [sage] 2018/03/10(土) 15:57:33.44

foo() echo foo ならzshは理解するぞ
Bourne shell系はfoo() any-compound-commandだけ理解して
foo() any-commandは理解しない
名無しさん@お腹いっぱい。 [sage] 2018/03/10(土) 18:45:48.71

POSIX準拠なのかはよくわかりませんが、sh ならば

foo()
foo1() echo "$1"

で、sh でも bash でも動かすなら

foo() { :; }
foo1() { echo "$1"; }

でいけると思います。
名無しさん@お腹いっぱい。 [sage] 2018/03/10(土) 23:10:12.04
訂正
× foo(): echo foo
○ foo() echo foo



ごめん、zshでは試していなかった。
今zsh入れてたマシン壊れてるんだったw
別の環境にzsh入れたらたしかに動いたね

dash、ash、zsh では動いた
bashだけ動かなかった
名無しさん@お腹いっぱい。 [sage] 2018/03/10(土) 23:17:51.17
func() :
↑これ確かにシェバンを #! /bin/sh にすると通るけど
#! /usr/bin/env bash にすると撥ねられるな。
ttp://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_05
一応現行POSIXのシェル関数の定義はここに書いてあるけど、func() : は恐らく適合してるな。
多分bashの文法チェックが少しばかりおせっかいすぎるんだろう。
でもPOSIXに準拠した記法なのにエラーになるって嫌だなぁ
632 [sage] 2018/03/10(土) 23:21:43.98
あれ。yashでも「syntax error: a function body must be a compound command」って撥ねられるわ。
yashはかなり厳密にPOSIXに従ってる筈なんだけど…
名無しさん@お腹いっぱい。 [sage] 2018/03/11(日) 00:25:29.87
またちょうどよくシバンの話がw

シェルスクリプトのファイルを直接実行するのではなく
ライブラリとして他のスクリプトから読み込むだけの場合
シバンいらないよね? またその場合の拡張子ってどうしてる?

シンタックスハイライトとか自動で適用させたいんだけど
余計なものはできるだけ排除したい
名無しさん@お腹いっぱい。 [sage] 2018/03/11(日) 00:28:14.22

そうなんだよね。あと

> fname ( ) compound-command [io-redirect ...]

ここにio-redirectが書けたのがびっくり
どういう時に使えば良いんだろうか?
632 [sage] 2018/03/11(日) 01:05:34.01


俺は未インストールコマンドの処理に使ってる

check_command()
{
type "$1" > /dev/null 2>&1 || {
printf '%s%s\n' \
"$1" 'をインストールして下さい。'
exit 1
} >&2

return $?
}

check_command "curl"

こうするとエラーメッセージが標準出力に出ないからパイプ繋いでてもおかしなことになりにくい。
もっとも |& ←みたいなパイプなら無理だけど、そもそも標準エラー出力ごとパイプに使うなんて稀だろうという推測。
名無しさん@お腹いっぱい。 [sage] 2018/03/11(日) 01:46:36.03

いや、そうではなくて関数定義の最後に書けるんだなーって話

その例で言えば、こういう書き方ってこと
(関数全体を別の所に出力したいときには便利か、うーん使うかな?)

check_command()
{
 type "$1" > /dev/null 2>&1 || {
  printf '%sをインストールして下さい。\n' "$1"
  exit 1
 }
} >&2

# ついでにどうでもいい所を俺の趣味で変更したw
# exitもreturnに変えたい。もしくはexit_if_command_not_foundみたいな関数名にしたい


> もっとも |& ←みたいなパイプなら無理だけど、そもそも標準エラー出力ごとパイプに使うなんて稀だろうという推測。

/dev/ttyに出力するって手もあるよ

$ (echo stdout-a; echo stderr-a >&2; echo tty-a >/dev/tty) |& sed 's/a/b/'
tty-a
stdout-b
stderr-b
名無しさん@お腹いっぱい。 [sage] 2018/03/11(日) 02:00:39.65

yash覚えた

最低限機能しかももってないと思われるashで動けば
Bourne Shell 系全部でうごくだろうと思っていたから
そういうこともあるんだなーって思った
632 [sage] 2018/03/11(日) 02:47:31.38

あ,そういうことか。勘違いしてたわw それはちょっと使い道思い付かん

ところで,
return $?
↑これ消した理由なに? C言語をやってるせいか関数が終了ステータスを返さないと不安で仕方無いんだけども,
シェルスクリプトだと要らないのかな。今まで特にreturn行のせいで不具合が発生したこともなかったけれど。
名無しさん@お腹いっぱい。 [sage] 2018/03/11(日) 11:42:23.58

何も書いてなければ、その時点の$?がそのまま返るだろ?

> C言語をやってるせいか関数が終了ステータスを返さないと不安で仕方無いんだけども,
Ruby(最後に評価された値を返す)やってるとreturnなんて書かないんだがw
名無しさん@お腹いっぱい。 [sage] 2018/03/11(日) 11:44:13.17
> 今まで特にreturn行のせいで不具合が発生したこともなかったけれど。
まあ不具合は発生しないだろうね。

関数の最後でなにもしないなら、その時点の $? が返る所を
$?を取り出してreturnの引数で$?を返すようにしただけだからw
名無しさん@お腹いっぱい。 [sage] 2018/03/11(日) 13:19:13.21
Cとか化石みたいな言語使ってる人って無駄が多いよね
生産性悪w
名無しさん@お腹いっぱい。 [sage] 2018/03/11(日) 13:41:26.14
そういうこと言う奴って大体Cが出来ないコンプレックス抱えてるんだよなぁ
名無しさん@お腹いっぱい。 [sage] 2018/03/11(日) 13:44:23.08
Cから学べること多いのになぁ
名無しさん@お腹いっぱい。 [sage] 2018/03/11(日) 13:59:18.74
Cはハードに近いところを表現するのに適してるから絶対に無くならないけどね。
化石だけど生活には欠かせない燃料みたいなもんかな。
Cで書かれてるシェルのスレで否定しちゃうのはちょっと痛いね。
名無しさん@お腹いっぱい。 [sage] 2018/03/11(日) 14:52:52.42
俺はCを否定してないぞ。C以外を使っていれば
returnしなくていい言語だってあることを知るだろうし、
returnを書くことに拘る必要はないってことだ
名無しさん@お腹いっぱい。 [sage] 2018/03/11(日) 16:03:25.28

ruby使ってたってreturn書くことあるだろ
implicitとexplicitを状況に応じて使い分けることが大事
名無しさん@お腹いっぱい。 [sage] 2018/03/11(日) 16:26:06.07
山月記ってアニメ化されないの?
名無しさん@お腹いっぱい。 [sage] 2018/03/11(日) 16:39:38.95

ルビ厨の相手するなよ
名無しさん@お腹いっぱい。 [sage] 2018/03/11(日) 17:07:11.55

Cに対するコンプレックス同様
Rubyに対するコンプレックスも見苦しい
名無しさん@お腹いっぱい。 [sage] 2018/03/11(日) 22:37:37.82

returnを省略できる場合に、returnを書くことはないよ
名無しさん@お腹いっぱい。 [sage] 2018/03/12(月) 09:24:03.09
話をぶった切ってすまんが、なるべく依存関係が少ない・かつインタラクティブがある程度機能的なPOSIX互換シェルって何があるかな。
ksh98とかyashとかは使ったことあるけど、ああいう感じでもうちょい開発が盛んなやつとか知らない?
名無しさん@お腹いっぱい。 [] 2018/03/12(月) 17:35:16.53
連続足し算だけど
#!/bin/bash

while true
do
add=expr 0
read x
add=$(($add + $x))
echo '----------'
echo ' ' $add
done

でできるが
line 5: 0: command not found
1
----------
1
./tasizan-renzoku.bat: line 5: 0: command not found
2
----------
3
./tasizan-renzoku.bat: line 5: 0: command not found

と 気色悪い。 どうすれば正解なの?
名無しさん@お腹いっぱい。 [sage] 2018/03/12(月) 17:39:55.92
expr 0が何も囲われてないが大丈夫か
名無しさん@お腹いっぱい。 [] 2018/03/12(月) 17:48:20.94
すごいね、以下でエラーがなくなった。

#!/bin/bash
while true
do
add=(expr 0)
read x
add=$(($add + $x))
echo '----------'
echo ' ' $add
done
名無しさん@お腹いっぱい。 [] 2018/03/12(月) 17:49:39.62
エラーがなくなった が 足し算の合計もなくなった
名無しさん@お腹いっぱい。 [] 2018/03/12(月) 17:58:34.26
a=0
while read x; do
a=$((a + x))
echo ----------
echo ' ' $a
done
名無しさん@お腹いっぱい。 [] 2018/03/12(月) 18:02:05.44
ありがとう。 合計を外側で定義することがわからなかった。
こうなると 電卓より便利!
名無しさん@お腹いっぱい。 [] 2018/03/12(月) 22:12:41.08
【大統領】   Japは我々の家畜  <大イスラエル帝国>  安楽に暮らせる奴隷   【議定書】
ttp://rosie.5ch.net/test/read.cgi/liveplus/1520856333/l50
名無しさん@お腹いっぱい。 [sage] 2018/03/12(月) 23:38:42.01
また頭がおかしいのがわいてきた
UNIX板荒らさないでほしい
名無しさん@お腹いっぱい。 [sage] 2018/03/13(火) 00:08:45.00
コマンドにローマ字で名前付けるやつは多かれ少なかれキチ成分が入ってる (経験からくる偏見)
名無しさん@お腹いっぱい。 [sage] 2018/03/15(木) 11:45:55.61

書いといた方がデバッグが楽だぞ
名無しさん@お腹いっぱい。 [sage] 2018/03/15(木) 22:29:00.04

あんまりそう思ったことないな
名無しさん@お腹いっぱい。 [sage] 2018/03/17(土) 03:48:34.81
for i in `seq -f %02g 1 10`

do
echo ${i}
done


このfor文の中で01の時に1、02の時に2を指定する方法ってありませんか?
簡潔に言うと先頭の0を取ったものを使いたいです
名無しさん@お腹いっぱい。 [sage] 2018/03/17(土) 08:33:32.12

どうしてデバッグが楽なのか知らんが、
少なくともprintfデバッグすると
終了コードが0に変わるからデバッグしづらいな
名無しさん@お腹いっぱい。 [sage] 2018/03/17(土) 08:52:03.87

2桁と決まっているなら

echo "${i##0}"


逆にしてこっちのほうが楽だと思うが

for i in $(seq 1 10)
do
printf "%02d\n" $i
done
名無しさん@お腹いっぱい。 [sage] 2018/03/17(土) 08:52:41.56
訂正

printf '%02d\n' "$i"
名無しさん@お腹いっぱい。 [sage] 2018/03/17(土) 20:01:50.50
拡張POSIX準拠らしいけど
echo {1..10} {01..10}

arch linuxだと普通のshでも展開してくれる
名無しさん@お腹いっぱい。 [sage] 2018/03/17(土) 20:09:04.24
ありがとうございます
名無しさん@お腹いっぱい。 [sage] 2018/03/17(土) 21:41:11.21
どういたしまして
名無しさん@お腹いっぱい。 [sage] 2018/03/17(土) 22:02:49.28

> arch linuxだと普通のshでも展開してくれる
してくれなかったぞ
名無しさん@お腹いっぱい。 [sage] 2018/03/17(土) 23:05:13.47
> 拡張POSIX準拠らしいけど

拡張POSIXってしう仕様があるの?
POSIXを拡張したもので、POSIX非準拠って意味だと思ってたんだけど?
名無しさん@お腹いっぱい。 [sage] 2018/03/18(日) 00:55:12.66
シェルスクリプトってさ、POSIXが標準だけど
実質bashがデファクトスタンダードって考えて良いのかな?
zshやfishを使っていてもbashはインストールされていると考えていい?

いや、あるコマンド作ろうと思ってるんだけど、
基本はPOSIXで動くようにするけど、bashがインストールされていれば
拡張機能が使えるようになる。という仕組みは
ほぼすべての人が拡張機能使えると考えて良いんだろうかなって思って
名無しさん@お腹いっぱい。 [sage] 2018/03/18(日) 01:08:34.19

bash前提はだめ。
BSD系にはデフォルトで入っていないし、後から入れてもパスが違う。
名無しさん@お腹いっぱい。 [sage] 2018/03/18(日) 01:10:24.11

ごめん
/bin/shのバージョン確認してみたら
GNU bash, バージョン 4.4.19だった
名無しさん@お腹いっぱい。 [sage] 2018/03/18(日) 01:15:31.51

いやbash前提じゃないんだ。POSIX シェル前提。POSIX シェルだけで動く。
だけどbashがインストールされていれば拡張機能が使える
その拡張機能っていうのも、本質的な機能じゃなくて
なんていうかな、同じコマンドで実行結果も同じだけど情報が詳細に取れるって感じ

BSD系といってもMacはデフォルトでbashになったのは知ってる。
パスに関してはシバンではなくbashコマンド経由で実行すれば良いと思ってる
(切替可能なようにするのでどっちみちシバンには頼らないと思うし)
名無しさん@お腹いっぱい。 [sage] 2018/03/18(日) 01:16:39.04

うん、たしかCentOS系はbashへのシンボリックリンクになってたはず
Debian系はdashなので拡張POISXは使えない
名無しさん@お腹いっぱい。 [sage] 2018/03/18(日) 09:35:45.26
POSIX規定外のことをPOSIX拡張って書くのは誤解のもとだからやめた方がいい。
伝統的にシェルにはなくてPOSIXで増えた機能のことをPOSIX拡張とよぶことがあるので、意味が真逆。
名無しさん@お腹いっぱい。 [sage] 2018/03/18(日) 09:54:45.87
可搬性を考えるとPOSIX準拠で書く癖をつけた方が
自分のためになるなあ
名無しさん@お腹いっぱい。 [] 2018/03/18(日) 12:02:31.33
  ★★★The● best way to eliminate too much gap between rich and poor, is to decide the tax● rate of the progressive tax in the referendum(Root Tax).★★★

  この掲示板(万有サロン)に優●秀な書き込みをして、総額148万円の賞金をゲットしよう!(*^^)v
●  ttp://jbbs.livedoor.jp/study/3729/ →リンクが不良なら、検索窓に入●れる!
名無しさん@お腹いっぱい。 [sage] 2018/03/18(日) 14:34:15.18
POSIX準拠で書くのは結構つらいので
デファクトスタンダードであるbash機能のみで書くといいよ
名無しさん@お腹いっぱい。 [sage] 2018/03/18(日) 14:55:14.07

いっその事
ps -p $$ -o comm=
でシェルを見て処理を分けるとか
名無しさん@お腹いっぱい。 [sage] 2018/03/18(日) 15:53:34.91

見分け方は本質的なところじゃないんで
俺にとってはどうでもいい話だけど、
シェルの判定ではなくて機能チェックで見分けるよ

ブラウザをUserAgentで判定するのではなく
使いたい機能が使えるかどうかで判定するのと似たようなやり方ね

> ps -p $$ -o comm=
ちなみにそれcygwinではエラーになった
682 [sage] 2018/03/18(日) 22:58:03.92

bash や zsh の機能を多く使うならば、その都度機能が動くかどうか判定するより、
起動シェルを見て分岐したほうが手間がないという意味合いで書きました。

cygwin の ps は -o オプションは無いのですね。失礼しました。
freebsd の環境で hoge.sh に ps -p $$ -o comm= と書いて、
/usr/local/bin/bash ./hoge.sh とすると、bash と表示されます。
(debian とかの ps でも ok)

cygwin の /bin/sh は /bin/bash なのでシェルを見るよりその都度使用する機能を判定するほうがよさそうですね。
名無しさん@お腹いっぱい。 [sage] 2018/03/19(月) 06:19:05.05
> > ps -p $$ -o comm=
> ちなみにそれcygwinではエラーになった

マジで!? POSIXでも定義されてるんだけどなぁ
名無しさん@お腹いっぱい。 [sage] 2018/03/19(月) 14:02:30.98
壊れた動画探しに
ffmpeg -i input -f null /dev/null 2>&1 | grep -m 1 -Ii error
ffmpeg -i input -f null /dev/null 2>&1 | grep -q -i error
とやったのですけれど、grepにヒットしてもffmpegの動画読み込みが止まりません。
grepにヒットしたらffmpegを止めるにはどうすればいいのか。
いいアイデアはないですか。
名無しさん@お腹いっぱい。 [sage] 2018/03/19(月) 14:45:03.71
この手が使えるのではないか
ttps://stackoverflow.com/questions/7178888/grep-q-not-exiting-with-tail-f
名無しさん@お腹いっぱい。 [sage] 2018/03/19(月) 14:52:10.70
ffmpeg -xerror は使えないんだっけ
‘-xerror (global)’
Stop and exit on error
名無しさん@お腹いっぱい。 [sage] 2018/03/20(火) 00:41:07.30
bashがどうしても使えない化石サーバは廃品回収へ
名無しさん@お腹いっぱい。 [sage] 2018/03/20(火) 01:44:18.89
新Mac板から来ました。
カレントディレクトリ内にaacファイルがあれば、mediainfoでHE-AACかLC-AACか調査して、
l-smash muxerを使ってHE-AACとLC-AACでは別のコマンドにてm4aに詰め込みたいです。

以下のままだと、aacが無い場合は
-----
aacファイルはありません.
-----
iTunes MP4 muxing mode
./test.sh: 3 行: 27777 Segmentation fault: 11 muxer -i $file 〜
と表示されてしまいます。

AACファイルがない場合はmuxerのコマンドに進まないようにするにはどう書くといいんでしょうか?

続く
名無しさん@お腹いっぱい。 [sage] 2018/03/20(火) 01:44:57.18
続き

#!/usr/bin/env bash

for file in *.aac; do
if [ -e $file ] ; then
# aacファイルが存在する場合
mediainfo $file | grep '^Format profile *: LC$' >/dev/null 2>&1
#es=$?
else
echo "-----"
# aacファイルが存在しない場合
echo "aacファイルはありません."
fi
#------------------------------------
# HE-AACだった場合
if [ $? = 1 ] ; then
echo "-----"
muxer -i $file?sbr --file-format m4a -o ${file%.aac}.m4a
fi
#------------------------------------
#AACの場合
if [ $? = 0 ] ; then
echo "-----"
muxer -i $file --file-format m4a -o ${file%.aac}.m4a
fi
# .aacで終わるファイル名だけど、HEでもLEでもどちらでも無い場合はどうやるんだろうか
done
名無しさん@お腹いっぱい。 [sage] 2018/03/20(火) 06:10:19.91
$1は本当に直前に実行したのコマンドのステータスしか入らないから注意
ifで比較する前にecho $1で何が入ってるか確かめてごらん
それをふまえて論理構造組み直しな
名無しさん@お腹いっぱい。 [sage] 2018/03/20(火) 08:25:32.50
「AACの場合」の前後の fi と if ... の2行を else に置き換えた上で、mediainfo コマンドの直後に
「HE-AAC だった場合」以降の if/else 文を移動、ではだめかな。

$? はすぐに別のコマンドの結果を格納してしまうので、
. mediainfo ...
. MEDIAINFO_RET=$?
. ...
. if [ $MEDIAINFO_RET = 0 ] ; then ...
みたいにコマンド実行直後に別の変数に回収してみるといいかもね。
名無しさん@お腹いっぱい。 [sage] 2018/03/20(火) 10:06:24.97
,
ありがとう
早速試してみる
名無しさん@お腹いっぱい。 [sage] 2018/03/20(火) 11:43:54.77


どうもありがとうございます
試してみます

ググっていたら、同じようにエラーが出る人がいて、testの[]を二重のカッコ[[]]にしてるようでした

今見返したら、es=$?でやってみようと思ってたのに途中になってたっぽいです
名無しさん@お腹いっぱい。 [sage] 2018/03/20(火) 12:10:20.27
for文脱出したいだけならbreak
名無しさん@お腹いっぱい。 [sage] 2018/03/21(水) 02:19:38.65


うまくいきました。
どうもありがとうございます。


書き換え前のスクリプトで試しましたが、こちらもエラーが出ませんでした。
どうもありがとうございます。

オライリーの入門bashには、ループの終了にbreakを使うのは良くないと書いてありました。
それはなぜでしょうか?
名無しさん@お腹いっぱい。 [sage] 2018/03/21(水) 02:54:50.71

今回みたいなエラー処理の場合はexitした方が良いかもね
名無しさん@お腹いっぱい。 [sage] 2018/03/21(水) 09:34:02.98

なるほどです
名無しさん@お腹いっぱい。 [sage] 2018/03/21(水) 23:13:42.44




上の場合はmediainfoの終了ステイタスで判断して次にさらにif〜と進んでいるんですが、
LCかHE-AACかそのどっちでも無いかをcace〜muxer〜っとやるほうが確実なのかなと思いました。

その場合、
mediainfo $FILE | grep -E '^Format profile *: LC$|^Format profile *: HE-AAC / LC$'
で出てきた文字列をcaseに渡したいんですが、

case HOGE in
"*: LC" ) muxer〜;;
"*: HE-AAC / LC" ) muxer〜;;
* ) "AACではない";;
ecase

だった場合、HOGEにはどう書けばいいんでしょうか?
名無しさん@お腹いっぱい。 [sage] 2018/03/22(木) 00:30:54.25

HOGE=$(mediainfo $FILE | grep -E '^Format profile' | sed -E 's/.*: (.*)/\1/‘)

mediainfoの出力をgrepでFormat profileの行だけに絞って
それをsedで必要な箇所だけ置換して変数に入れてる
円マークはバックスラッシュに変換してね
名無しさん@お腹いっぱい。 [sage] 2018/03/22(木) 00:40:17.02
sedじゃなくbashのstring manipulationを使いたければ

HOGE=$(mediainfo “$FILE” | grep -E '^Format profile')
case ${HOGE##*:} in


${HOGE##*:} はHOGE内の文字列を先頭から”:”まで最長一致で取り除く
名無しさん@お腹いっぱい。 [sage] 2018/03/22(木) 00:59:34.53
自己レス

HOGE=`mediainfo $FILE | grep -E '^Format profile *: LC$|^Format profile *: HE-AAC / LC$'`
case $HOGE in

これで大丈夫そうですね
名無しさん@お腹いっぱい。 [sage] 2018/03/22(木) 01:02:19.80


どうもありがとうございます
今触れないので、あとでやってみます!
700 [sage] 2018/03/22(木) 01:05:43.95



の3つは私です
名無しさん@お腹いっぱい。 [sage] 2018/03/22(木) 01:26:33.69
文字列を1文字ずつ処理するってどうやれば良いのかな?
名無しさん@お腹いっぱい。 [sage] 2018/03/22(木) 01:26:58.52
なるべく速い方法で
名無しさん@お腹いっぱい。 [sage] 2018/03/22(木) 01:40:38.44
先頭の一文字を削除するっていうのはできるんだけどなぁ。
一文字削除したらな、その削除した一文字を取りたいものだ
あ、POSIXの話ね
名無しさん@お腹いっぱい。 [sage] 2018/03/22(木) 01:43:14.01
あ、これでいけるのか

str=abcdefg
last=${a##?}
echo ${str%%$last}
名無しさん@お腹いっぱい。 [sage] 2018/03/22(木) 01:43:57.68
exprが柔軟かな
名無しさん@お腹いっぱい。 [sage] 2018/03/22(木) 02:17:21.19
grep -o .
名無しさん@お腹いっぱい。 [sage] 2018/03/22(木) 02:28:14.30

速いかどうか分からんけど awk でやるなら

printf 'Hello\nWorld\n' | awk -F '' '{for(i=1;i<=NF;i++) print $i}'

とかかなぁ。grep -Eo '.' ってのもあるけど

for c in $(printf 'Hello\nWorld\n' | grep -Eo '.')
do
echo "$c"
done

あとは fold コマンドとかで。

printf 'Hello\nWorld\n' | fold -w1
名無しさん@お腹いっぱい。 [sage] 2018/03/22(木) 02:37:08.12
間違えてた

str=abcdefg
last=${str##?}
echo ${str%%$last}
名無しさん@お腹いっぱい。 [sage] 2018/03/22(木) 02:39:35.06

後出しだけど、意外と改行まで1文字として扱うのは大変なんだよね
名無しさん@お腹いっぱい。 [sage] 2018/03/22(木) 02:48:27.27
改行を扱いたい場合は bash か zsh の read かな。

printf 'Hello\nWorld\n' | while read -r -n 1 c;do echo "$c"; done

awk の場合は RS に '\0' をセットすればいいかも

printf 'Hello\nWorld\n' | awk -vRS='\0' -F '' '{for(i=1;i<=NF;i++) print $i}'
名無しさん@お腹いっぱい。 [sage] 2018/03/24(土) 18:09:58.40
公開するようなシェルスクリプトって--helpオプションくらいは付けたほうがいいかな。
問答無用で第一引数をファイル名やらURLやらだと解釈するほうがはるかに楽だし簡潔になるんだけども。
名無しさん@お腹いっぱい。 [sage] 2018/03/24(土) 18:17:47.94
オプションで思い出した。
オプションの解析めんどくせーとか思って他の言語のライブラリを参考に
オプション解析のライブラリを作ろうかと思ってるんだが、
getoptやgetopts程度だと使いやすくなった気がしないし、
作った所でそんなに簡単に書けるようなもんでもなさそうで、
何のためにコレが必要なんだ?って思いなした結果
他言語にあるようなライブラリは、--helpを半自動で
生成してくれるものだと思ってたりする
でももう少しオプションの解析楽にならないかな?
どうすればいいんだろう
名無しさん@お腹いっぱい。 [sage] 2018/03/25(日) 01:51:02.53
ある文字列のハッシュ値を求めたいんですけど
どのLinux/UNIX/FreeBSDでも標準ではいってる
ハッシュ化コマンドって何がありますかね?

それからPOSIX標準コマンド?みたいなものってあるんですか?
どこでも絶対はいっていなければいけないコマンドとか
名無しさん@お腹いっぱい。 [sage] 2018/03/25(日) 02:25:15.03
POSIXってこれ?
ttp://pubs.opengroup.org/onlinepubs/9699919799/
700 [sage] 2018/03/25(日) 02:29:04.48
DATE=`date '+%Y%m%d%H%M'`
TMPDIR='/tmp'
BAKDIR='$TMPDIR/backup_%DATE'

#echo "$DATE"
mkdir $TMPDIR/backup_$DATE
cp -rfp /home/atashi/doc $BAKDIR

これだとcpが出来ないんですがどこが間違えていますか?
名無しさん@お腹いっぱい。 [sage] 2018/03/25(日) 02:29:55.81
ない
700 [sage] 2018/03/25(日) 02:34:52.38
最後の行は
cp -rfp /home/atashi/doc $BAKDIR/docです
名無しさん@お腹いっぱい。 [sage] 2018/03/25(日) 02:41:09.90

3行目の%が間違ってるよね?

あと
4行目でデバッグ用にechoすべきは$BAKDIR
5行目はmkdir “$BAKDIR”
一つ一つ確認したほうがいいよ
名無しさん@お腹いっぱい。 [sage] 2018/03/25(日) 02:44:00.47

BAKDIR='$TMPDIR/backup_%DATE'

こうじゃない?

BAKDIR='$TMPDIR/backup_$DATE'
名無しさん@お腹いっぱい。 [sage] 2018/03/25(日) 02:44:27.17
あ、かぶったw
700 [sage] 2018/03/25(日) 03:03:57.65


ほんとだ。
$に直したんですが、

DATE=`date '+%Y%m%d%H%M'`
TMPDIR='/tmp'
BAKDIR='$TMPDIR/backup_$DATE'

echo "$TMPDIR"
#mkdir "$BAKDIR"
echo "$BAKDIR"

を実行すると、
$ ./hoge.sh
/tmp
$TMPDIR/backup_$DATE

になってしまって、ダメでした。

mkdir "$BAKDIR"
を入れると、カレントディレクトリに「$BAKDIR」というフォルダが出来てしまいました
名無しさん@お腹いっぱい。 [sage] 2018/03/25(日) 03:13:28.38

シェル シングルクォートとダブルクォートの違い 辺りでググってみて
700 [sage] 2018/03/25(日) 03:17:52.62
DATE=`date '+%Y%m%d%H%M'`
TMPDIR='/tmp'
BAKDIR="$TMPDIR/backup_$DATE"

echo "$TMPDIR"
mkdir "$BAKDIR"
echo "$BAKDIR"


出来ました!
どうもありがとうございました。

$ ./test.sh
/tmp
/tmp/backup_201803250316
700 [sage] 2018/03/25(日) 04:07:06.26
上の後に
cp -rfp /home/hoge/doc $BAK_DIR/doc
zip -r $BAK_DIR.zip $BAK_DIR
をやるとzipを解凍してみたら
tmpフォルダが出来てその中にbackup_201803250348フォルダが出来ているんですが、
zipを解凍したらbackup_201803250348フォルダが出来るようにするにはどうしたらいいですか?
名無しさん@お腹いっぱい。 [sage] 2018/03/25(日) 09:39:54.86
( cd $TMPDIR ; zip -r backup_$DATE.zip backup_$DATE )
名無しさん@お腹いっぱい。 [sage] 2018/03/25(日) 16:41:32.60
すみません、timeoutコマンドのうまい使い方を教えてください

シェルの中でtimeoutでタイムアウトさせた場合、シェル丸ごとごと落ちてしまいます
タイムアウトさせた上で処理を分岐させて継続して処理させるにはどう制御したら良いのでしょうか

timeout unzip || func_hoge
といった感じで一応回避できたのですが、関数処理が終わると丸ごとプロセスキルされる事には変わらず、綺麗に終わらすことができません
名無しさん@お腹いっぱい。 [sage] 2018/03/25(日) 16:54:52.07
timeoutコマンドを実行したシェルは落ちないよ
$ timeout 1 unzip … としたときに
タイムアウト後にunzipのプロセスがキルされると困るって話??
名無しさん@お腹いっぱい。 [sage] 2018/03/25(日) 17:56:56.40
ttps://linuxjm.osdn.jp/html/GNU_coreutils/man1/timeout.1.html
コマンドがタイムアウトした場合で、かつ --preserve-status が設定されていない場合、 終了ステータスは 124 になります。
名無しさん@お腹いっぱい。 [sage] 2018/03/25(日) 19:03:35.42

紛らわしい書き方をしてすみませんでした
シェルスクリプトです

今環境がないので具体的な結果を示せませんが、例えば以下のような処理を実行するとtimeoutがプロセスを落とした(?)メッセージがコンソール出力された後、後続のechoは何も表示されません

#/bin/bash
timeout 1 unzip piyo.zip
if [ $? -ne 0 ]; then
echo hoge
else
echo fuga
fi
echo owata
名無しさん@お腹いっぱい。 [sage] 2018/03/25(日) 19:19:17.27

んー。こっちでは表示されるけれども…
Script started on 2018年03月25日 19時18分12秒
testuser@debian:~/var/tmp/temp$ cat ./to.sh
#! /bin/sh -

timeout 1 sleep 10
if [ $? -ne 0 ]; then
echo hoge
else
echo fuga
fi
echo owata
testuser@debian:~/var/tmp/temp$ ./to.sh
hoge
owata
testuser@debian:~/var/tmp/temp$ exit
exit

Script done on 2018年03月25日 19時18分30秒
700 [sage] 2018/03/25(日) 21:40:43.57

どうもありがとうございます
名無しさん@お腹いっぱい。 [sage] 2018/03/25(日) 22:27:12.96
ていうか
BAKDIR
がいつから
BAK_DIR
になったんだ
名無しさん@お腹いっぱい。 [sage] 2018/03/25(日) 22:38:36.41
このコードってvalidですよね?
やってること・・・foo関数が最初に呼ばれた時に
OS判定(相当)のことをして、OS毎に処理を切り替えて実行
関数を上書きすることで、次回以降は判定することなく処理実行

#!/bin/sh

foo() {
echo first call

os_type=linux

[ $os_type = linux ] && \
foo() {
echo linux
}

[ $os_type = mac ] && \
foo() {
echo mac
}

foo
}

foo
foo
名無しさん@お腹いっぱい。 [sage] 2018/03/25(日) 22:53:06.94

なんででしょうね(´;ω;`)
もう一度見直してみます
名無しさん@お腹いっぱい。 [sage] 2018/03/26(月) 08:52:17.43
くだらないtypoしていたに一票。
変だと思ったら、
sh -x スクリプト名
でなにやってるか眺めてみることをオススメする。
勿論、標準エラーを /dev/null に捨てたりするのもナシで。
名無しさん@お腹いっぱい。 [sage] 2018/03/26(月) 11:04:26.16
再確認してきました
実際にはリンク先の48,49行目のログ整形のための処理で問題が起こっているようです
timeout自体の問題ではないので一旦取り下げます、ご協力ありがとうございました

ttps://pastebin.com/F5QC2Yu5
名無しさん@お腹いっぱい。 [sage] 2018/03/26(月) 11:13:47.05
ワロタw

fail() {
case "$1" in
0)
echo "Info :$2"
;;
1)
echo "Warn :$2"
;;
2)
echo "Error:$2"
;;
3)
echo "Success :$2"
exit 0
;;
4)
echo "Fatal:$2"
exit 1
;;

esac
}
名無しさん@お腹いっぱい。 [sage] 2018/03/26(月) 11:16:57.86
failwww ひどいなw

fail 0 " **** test start ****"

WAIT_SEC=5
time timeout -sKILL ${WAIT_SEC} unzip -t /home/xxxx/crypto.zip
if [ $? -ne 0 ]; then
fail 2 "hage"
else
fail 0 "hoge"
fi

fail 3 "**** test end ****"
名無しさん@お腹いっぱい。 [sage] 2018/03/26(月) 11:20:23.93
おお、是非原因と対処法も書いてってください
名無しさん@お腹いっぱい。 [sage] 2018/03/26(月) 11:22:56.42
failなのにsuccessなのか…
名無しさん@お腹いっぱい。 [sage] 2018/03/26(月) 11:47:56.48

原因・・・他人のコードを理解せずにパクって、行き当たりばったりにコード書き加えて、終わらすこと
対処法・・・ちゃんとコード読んで理解して無駄なものをなくせ
名無しさん@お腹いっぱい。 [sage] 2018/03/26(月) 12:55:45.54

全く耳が痛い、実際そういうレベルだけど頑張るよ(´・ω・`)
> >は実際わけわからずに使ってるし
名無しさん@お腹いっぱい。 [sage] 2018/03/27(火) 02:35:57.99
あー、ちくしょ、
ローカルでもリモートでも使うスクリプトを
置くディレクトリ名が決まらない

ローカルだけで使うスクリプト
リモートだけで使うスクリプト
両方で使うスクリプト

どういうディレクトリ構成にしよう
Windowsも考慮したいから
シンボリックリンクは使いたくない
名無しさん@お腹いっぱい。 [sage] 2018/03/27(火) 02:56:48.81
またお前か
名無しさん@お腹いっぱい。 [sage] 2018/03/27(火) 19:30:16.58

~/share/public/
に置いてる。
名無しさん@お腹いっぱい。 [sage] 2018/03/27(火) 20:19:33.81
なんか冗長な感じ
名無しさん@お腹いっぱい。 [sage] 2018/03/27(火) 21:50:15.67
うちは~/share/public/sbin/
名無しさん@お腹いっぱい。 [sage] 2018/03/27(火) 22:20:21.84
あんまり良くないのかもしれんが……
/srvを特定の一般ユーザに対して書込可にして、
/srv/git/github.com/<account name>/dotfiles (GitHubで管理するなら)
にしてる。
名無しさん@お腹いっぱい。 [] 2018/03/27(火) 23:56:34.98
>>753そんなことしてまで/srvに置く意味あんの
名無しさん@お腹いっぱい。 [sage] 2018/03/28(水) 14:37:11.36

なぜ/usr/remote/binじゃダメなのか 理由を知りたい
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 01:01:26.37

逆になぜ/usr/remote/binなのかの理由が知りたい。
なにかのアプリケーションが使うの?
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 02:51:11.17
findのprint0やった、NULL文字区切りのファイル名一覧って
POSIXのreadじゃ読み取れないんだな-dオプションがないから

つーことはファイル名に改行、そのた制御文字が入るかもしれないことを
考慮するとPOSIXの範囲じゃ対応不可能ってことなのか
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 03:44:39.70

なんで対応不可能だと思うんだよw
じゃあどうして「POSIXが」ファイル名に改行含め制御文字を許可してるんだよって話。
C99どころかシェルコマンド(awk)レベルで余裕で扱えますが
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 09:47:58.90

ひねくれた回答はいらないよ
ここはシェルスクリプト
POSIX shが対応してないって言ってんの
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 09:57:03.22
\0区切りもshそのものの機能じゃなくね?
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 10:03:19.16
空白制御文字入りファイル名は
for i in *
で扱えるので、工夫次第だな。
findと組み合わせるには-print0は役に立たんから-execで頑張るしかないけど。
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 10:30:24.37
\0区切りがなんのコマンドによる出力かどうかは
今は関係ないんだよ。
いろんなコマンドでよく使われる\0区切りのデータに
shが対応していないって話をしているんだから

で調べてみたらawkもポータブルな方法では
\0区切りには対応してないようだな
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 11:35:38.17

> いろんなコマンドでよく使われる\0区切りのデータ
って何がある?
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 11:37:07.53

shはポータブルな方法で対応してるぞ。
xargsは確かに対応してないが。
findについてはが書いてるように、遅くはなるもののポータブルな解はある。

xargs と sh の区別はつけようぜ。
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 11:39:23.23
MacOSのsed (bsd)も\0扱えないっぽい
まあもともと\0はC言語の終端文字だしな
そんなのが扱えるほうがおかしいか
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 11:44:03.16

xargsの話は誰もしてない
shは\0を変数に入れられない
shがポータブルな方法で\0文字に対応してるってのは嘘
(forは\0を使わない)
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 11:51:22.35

改行じゃなくて \0 の話をしてるのか。
POSIXではシステムコールの仕様上、 \0 をファイル名に入れることは決してできない。
だから、ファイル名に \0 を使う話をすること自体が、POSIX的にナンセンス。
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 11:55:53.07

> ファイル名に \0 を使う話
はお前しかしていないよ。
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 11:59:26.26

発端のはファイル名に改行を入れる話だろう。
ファイル名中の改行をポータブルに扱う方法はshにある。
みんなちゃんとそう指摘してるのに君だけ勘違いしてる。
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 12:20:16.06
は?バカなのかこいつ?
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 12:38:36.81
なんで改行の入ったファイル名を扱うために、シェルが \0 を文字列の一部として
扱う必要があるなんていうアサッテの発想にいたるのか…
(まあプログラミングができないせいで分かってないんだろうけど)

もうちょっと態度がまともなら、ポータブルなやり方を具体的に教えてやっても
いいが、 みたいな煽りは嫌いなので教えてやらないw
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 12:40:47.01
findのprint0で出てくる/0区切りのファイル名一覧がreadで読み取れないンゴ…
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 12:50:37.16
そもそも -print0 の出力をそのままの形でポータブルに
read で読めるんじゃないかと考えること自体が間違い。
POSIXで規定されている read のオプションは -r だけで
-d はないので、改行を含む文字列をそのままで read だけを
使って単一の文字列変数に取り込むことは、ポータブルには
できない。

もちろん、だからといって sh で改行を含む文字列を扱えない
なんてことにはならないのは言うまでもない。
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 12:54:44.85

無知ごくろうさんw
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 12:56:17.18
やっとが言ったことに追いついたのか?
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 13:05:43.31
773って757が言ったことを冗長に言い換えただけだなw
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 13:11:26.76

>なんで改行の入ったファイル名を扱うために、シェルが \0 を文字列の一部として
>扱う必要があるなんていうアサッテの発想にいたるのか…
find作ったやつに言えw
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 13:21:49.15
> findのprint0やった、NULL文字区切りのファイル名一覧って
> POSIXのreadじゃ読み取れないんだな-dオプションがないから

ここまでは正しい。しかし、

> つーことはファイル名に改行、そのた制御文字が入るかもしれないことを
> 考慮するとPOSIXの範囲じゃ対応不可能ってことなのか

これが xargs の文章であれば、その通り。
しかしこれが sh についての文章であれば、完璧に間違い。

これだけ繰り返し指摘されてもいまだに理解できないような奴でも
Bourne shell でスクリプトを書くようになったんだなという変な感慨があるな。
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 13:24:21.25

>これが xargs の文章であれば、その通り。
だれもxargsの話なんかしてない。(2回目)
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 13:26:26.64
はxargsが\0扱えることも知らなそうw
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 13:30:47.80
これだけヒント書いてるのに、いまだに
「そのままの形だと read で扱えない」

「sh だとできない」
が等価だと主張しているのは、アホの子なのか、
煽れば答を教えてもらえると期待しているのか、
どっちなんだろうね。
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 13:36:00.29


POSIX の xargs に -0 オプションは規定されてないので、
「ポータブル」という条件下ではできない。

まあ POSIX の find に -print0 オプションが入ったのもわりと最近なので、
そのうち xargs でも待ってればそのうち -0 が追加されるとは思うが。
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 13:39:13.18
答えはfor in * を使うこと
俺が代わりに答えておいてやるよ
なおshで\0を使うと言う答えではない
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 13:41:04.45
POSIXはprint0に対応する前に
ファイル名に制御文字を使用できないようにしろ
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 13:53:52.47
賛成
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 14:01:21.67
for使ってfindっぽいものを自作したとして
それをパイプで別コマンドに流そうとした時に
またファイル名に改行が含まれていた時問題が発生するんだよな
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 15:15:24.81
for で書くのなら、その結果のファイル名をわざわざ
他のプロセスにパイプで渡すなんてことはせずに、
そのシェル自身で処理するか、
あるいは他のプロセスに渡すなら引数を使え
ってだけの話だな。

が既に書いてる話なのに、なんでそこから
35コメも無駄に費やされてるんだか。
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 15:18:45.25
ちなみに for で書く以外のやりかたもあるけど、
これも が既に最後の文で書いてる。
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 15:30:33.97
posixの範囲じゃ改行が含まれたファイル名を
パイプでつなげられないってことかな
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 15:56:18.36

「POSIXの範囲内じゃ」は誤解を招く表現で、正確には
「POSIX Shell & Utilities の範囲内じゃ」だな。
「POSIX System Interfaces」を使えば問題なくできるからな。
まあシェルのスレなわけで「POSIXの範囲内じゃ」でも間違いとまでは言えないが。

あと、find -print0 が POSIX で規定されたってのは間違いだった。
そういう拡張もあることも言及はされてるが、規定には追加されていない。
でもって POSIX 的には「find -print0 | xargs -0」じゃなくて、
「find -exec コマンド {} +」を使えってことになってる。
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 16:20:44.05
でも、find -exec じゃシェル関数に渡せないからなぁ
findは諦めろってことかな
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 16:44:16.87
find を諦めるんじゃくて、シェル関数の方をあきらめて、独立したシェルスクリプトにしろってことだよ。
find -exec コマンド {} \;
だとコマンドの起動回数が多いからシェルスクリプトにすると遅いのが問題になるけど、
find -exec コマンド {} +
ならコマンド起動回数は相当に減るから、独立したシェルスクリプトにしても特に問題はない。
名無しさん@お腹いっぱい。 [] 2018/03/29(木) 21:07:16.05
AWKの区切り記号をヌル文字にすればいいんでは。
名無しさん@お腹いっぱい。 [sage] 2018/03/29(木) 23:50:16.88
ぬるぽ?
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 00:19:50.52

試してみたけどね。RSに\0入れられなくてね
もう全滅w
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 02:47:00.90

俺の所では通ったけど、もしかしてOS依存なのかな。
@Debian GNU/Linux
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 03:18:23.09
OSっていうかGNU系かどうかだね
GNU系はだいたい\0に対応している
BSD系とかは対応してない。だからMacとかつらい

私的なスクリプトならMacのコマンドをGNU化するやつ
入れて済ませても良いんだが
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 12:29:37.47

バカwww
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 12:30:43.62
このスレでこんなに草を見るとは思わなかった
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 13:42:54.12
シェル関数にこだわる理由が思いつかん。
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 15:22:07.88
そこにシェルスクリプトがあるから、的な何かかな?
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 15:47:33.25
コンパイルせずに実行できる(実質)唯一の共通規格言語だからじゃないの?
PythonとかはPOSIXの範囲外だからどこでも動くとは限らないし。
え? UNIX™なのにPOSIXと齟齬ありまくりの実装のAIXちゃん? 知らない子ですねぇ……。
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 16:25:04.06
localみたいにPOSIXじゃないけどだいたい
使えるってもの他にあったら教えて&#128225;
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 16:38:24.19
AIXはマジでどうにかして欲しい
seqすらないの本当に面倒臭い
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 17:03:19.85
AIX案件なんてあるの?
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 17:23:17.72
俺が行ってる現場だと1年くらい前までは現役でPowerでAIXを使ってたよ。
今はRedHatにリプレースされちゃったけど……そんなに嫌いではなかった。


jotも無かったっけ?
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 17:29:23.50
うちは親会社モニョモニョだから結構AIXが多くて嫌になる


手元のやつだとないな。AIX7.1だけど
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 20:26:28.33

それならシェル関数ではなく普通のシェルスクリプトでもいいだろう。
は単なるシェルスクリプトではなくシェル関数の利用にこだわってて謎。
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 20:31:30.33
シェル函数って
somefunc() {
echo "This is somefunc."
}
っていうやつでしょ?
はそういう意味で使ったんじゃない可能性が出てきたな。
単に「パイプに渡せない」というような趣旨の要望を言いたかったのかもしれん。
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 20:47:44.46

たぶん find の -exec のとこに書けないって意味で書いてるだろうから、
シェルスクリプトじゃなくてシェル関数だと思う。
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 20:54:31.32
たとえパイプ経由でファイル名を渡せないって意味だったとしても、
find -exec でそれと同一機能が実現できるならそ別にいいじゃん。
が find -exec の何を気に入らないのかやっぱり分からんな。
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 21:02:32.72
まぁでも「気に入らない」ってのは十分不採用の理由にはなるよな
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 21:09:13.58
趣味なら理由になるかもなあ。

でも仕事じゃ理由にならん。
要件を満たしてるってのは仕事じゃ最低限度の基準だからな。

POSIXに適合するシェルスクリプトにしたいっていう要件が最初に出てるのに、
趣味に合わないから採用しない、仕方ないから実装を諦めるなんて奴がいたら、
仕事なら無能扱いだよ。
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 21:13:23.18
そりゃ仕事と趣味は別だろ
何を当たり前の話をしてるんだ
名無しさん@お腹いっぱい。 [sage] 2018/03/30(金) 21:31:21.92
いや、あの謎のこだわりに合理的な理由があるのか、
それともホントに完全に趣味だけの話なのかが気になってたんだよ。
合理的理由ナシ、完全に個人の趣味ってことでFAなら、それでいいんだスマン。
名無しさん@お腹いっぱい。 [sage] 2018/03/31(土) 00:46:42.95
合理的じゃないけど合理主義だよね
名無しさん@お腹いっぱい。 [sage] 2018/03/31(土) 01:12:03.45
aliasって面白いなー。これでなんか面白いことできそう

#!/bin/sh

alias foo="foo() { echo before; foo_; echo after; }; foo_"
foo() {
echo foo
}
unalias foo

foo
# ↓
# before
# foo
# after
817 [sage] 2018/03/31(土) 01:41:51.42
やべぇ、このaliasの使い方、
めちゃくちゃ強力じゃないか?
文法の拡張が可能かもしれない
こんな所でネタにするレベルじゃないわ
817 [sage] 2018/03/31(土) 02:06:02.61
黒魔術置いときますね

#!/bin/sh

def() {
alias begin="$1() { echo before; $1_ "\$@"; echo after; }; $1_() { $3=\$1"
alias end="}; unalias begin end"
}

def foo [ i ]
begin
echo foo $i
end

def bar [ j ]
begin
echo bar $j
end

foo 123
bar 456
名無しさん@お腹いっぱい。 [sage] 2018/03/31(土) 02:30:40.57
そもそもaliasってシェルスクリプトの中で使えたっけ。
俺の環境では使えたけども
名無しさん@お腹いっぱい。 [sage] 2018/03/31(土) 02:48:01.26

bashとかだとデフォルトでは無効
expand_aliasesを使えば有効にできる

ただの挙動が全てのシェルで同じなのかは調べてない
aliasの挙動をちゃんと把握してはないけど
どうやら行単位で実行前に、単純な文字列置換が行われてる感じだね

だからevalでもできないスクリプトの自己書き換えみたいなことができちゃう

参考(ちゃんと読んではいないw)
ttp://magicant.txt-nifty.com/main/2017/10/yash-2-285-b4d8.html
名無しさん@お腹いっぱい。 [sage] 2018/03/31(土) 02:57:08.73
AIXの人はseqってどうやって代用してる?
名無しさん@お腹いっぱい。 [sage] 2018/03/31(土) 09:20:43.88
awkでチョチョイでは?
名無しさん@お腹いっぱい。 [sage] 2018/03/31(土) 22:32:30.06
みんな、変わった(?)の使ってるな。
Linux、BSD、Solarisなどのメジャーなもの以外で何がよく使われてるの?
名無しさん@お腹いっぱい。 [sage] 2018/03/31(土) 22:52:09.24
Mac
名無しさん@お腹いっぱい。 [sage] 2018/04/01(日) 01:13:29.58
MacはBSD系ってことでまとめましょうw
名無しさん@お腹いっぱい。 [sage] 2018/04/02(月) 07:41:52.65
$ man basename > man_basenam
でできるファイルを
emacsとテキストエディットで開いたものが次のものです。
ttps://imgur.com/a/8ggUs?
これはそういう仕様なのでしょうか?文字化けというか不思議な
コードになっています。できれば教えていただけないでしょうか
名無しさん@お腹いっぱい。 [sage] 2018/04/02(月) 08:19:02.96
ttp://surf.ml.seikei.ac.jp/~nakano/JMwww/html/man/man1/man.1.html

バックスペースとアンダースコアがない プレーンテキスト版の man ページを得るには、コマンド


# man foo | col -b > foo.mantxt

を実行すること。
名無しさん@お腹いっぱい。 [sage] 2018/04/02(月) 08:25:59.92

man エスケープシークエンス
で検索。
名無しさん@お腹いっぱい。 [sage] 2018/04/02(月) 10:28:43.52
man manすればいい
TIPSに載ってる
名無しさん@お腹いっぱい。 [sage] 2018/04/02(月) 14:17:49.92
あと、emacs に限って言うと
M-x man
(ESC x man リターン)
と叩いて、man のエントリー名を入れれば、
きっちり整形した結果を表示してくれるから、
col -b を使う必要はあまりない。
名無しさん@お腹いっぱい。 [sage] 2018/04/02(月) 18:03:58.27

ググってみたらこんな方法があったよ。

yes '' | cat -n | head -100 | sed 's/ //g'
名無しさん@お腹いっぱい。 [sage] 2018/04/02(月) 18:24:12.37
yesはなんか処理間違えると止まらなくなりそうで怖いんだよな
名無しさん@お腹いっぱい。 [sage] 2018/04/02(月) 21:00:30.14

POSIX catには-nオプションがない[*1]のでnlコマンドを使う方法を提案する。
 $ yes '' | nl -b a -n ln | head -n 10 | sed -e 's/[ \t]*//g' | tr '\n' ' '

*1: ttp://pubs.opengroup.org/onlinepubs/9699919799/utilities/cat.html
名無しさん@お腹いっぱい。 [sage] 2018/04/02(月) 21:07:04.97
 $ yes '' | nl -b a | head -n 10 | tr -d ' \t' | tr '\n' ' '
修正。もっと簡単にできるわww
834 [sage] 2018/04/02(月) 21:28:17.87
これもしかしたらheadコマンドとnlコマンドの順番入れ替えると速度違う?
んなことないと思ってたけどビミョーに差があるかもしれん。
詳しい人検証してくれ……。
$ time for a in $(seq 10000); do seq 10000 > /dev/null; done
real 0m14.601s
user 0m0.452s
sys 0m3.736s
$ time for a in $(seq 10000); do yes '' | nl -b a | head -n 10000 | tr -d ' \t' | tr '\n' ' ' > /dev/null; done
real 1m2.693s
user 0m5.672s
sys 0m21.032s
$ time for a in $(seq 10000); do yes '' | head -n 10000 | nl -b a | tr -d ' \t' | tr '\n' ' ' > /dev/null; done
real 0m47.944s
user 0m1.472s
sys 0m17.820s
名無しさん@お腹いっぱい。 [sage] 2018/04/02(月) 21:41:13.89
並行して動くか、出力の完了を待ってから動くかの違いだろ
名無しさん@お腹いっぱい。 [sage] 2018/04/02(月) 23:47:22.15
パイプで繋いでプロセス4つも5つも上げるくらいなら、
素直にawk 1プロセスですませた方が軽くないか?
836 [sage] 2018/04/02(月) 23:56:24.81

俺awkできないんだわ。恥かしいことにw
そのうち勉強しようしようと思っていて今にいたる。

awkでやるとどんな感じになる?
836 [sage] 2018/04/03(火) 00:14:31.67
ていうかseqの既定の出力を勘違いしてた
 $ yes '' | head -n 10 | nl -b a | tr -c -d '\n[:digit:]'
こんなもんかな?
$ time for a in $(seq 10000); do yes '' | head -n 10000 | nl -b a | tr -c -d '\n[:digit:]' > /dev/null ; done

real 0m42.358s
user 0m0.544s
sys 0m14.452s
名無しさん@お腹いっぱい。 [sage] 2018/04/03(火) 00:40:30.08
awk 'BEGIN {for(i=10;i<=20;i++) printf "%d\n",i}'
名無しさん@お腹いっぱい。 [sage] 2018/04/03(火) 01:08:09.19
yes '' | sed -n '=;10q'
名無しさん@お腹いっぱい。 [sage] 2018/04/03(火) 14:22:10.27
sedでやるとは
名無しさん@お腹いっぱい。 [sage] 2018/04/03(火) 18:22:16.97
何かゴルフっぽくなってきてるw


これ凄いね!
名無しさん@お腹いっぱい。 [sage] 2018/04/03(火) 18:57:15.26
sedって計算完備なんだっけ。
やろうと思えばsed単体でseq作れるよね
名無しさん@お腹いっぱい。 [sage] 2018/04/03(火) 19:03:30.37
sedでlispを作った人はいる
名無しさん@お腹いっぱい。 [sage] 2018/04/03(火) 19:33:57.64
どうかしてるぜ
名無しさん@お腹いっぱい。 [sage] 2018/04/03(火) 22:20:55.54

使うことないだろうけど感動した
名無しさん@お腹いっぱい。 [sage] 2018/04/03(火) 23:45:32.30
そんなことより野球やろうぜ
名無しさん@お腹いっぱい。 [sage] 2018/04/04(水) 07:05:11.03

> sedって計算完備なんだっけ。
ttp://www.catonmat.net/blog/proof-that-sed-is-turing-complete/
名無しさん@お腹いっぱい。 [sage] 2018/04/05(木) 00:02:39.79
家具家電彼女完備の家に住みたい
名無しさん@お腹いっぱい。 [sage] 2018/04/05(木) 02:42:14.79
sinyabin.shの中でradiru.shを実行しています。
sinyabin.shの中の変数をradiru.shに引き継ぎたいんですが、どう書けばいいんでしょうか?
852 [sage] 2018/04/05(木) 03:31:27.11
radiru.shには、
pushbulettに録音開始の通知
ffmpegを使ってaacのダウンロード
l-smashを使ってaacをm4aに詰め替え
aacの削除
dropboxへm4aのアップロード
ローカルのm4aの削除
pushbulettに録音終了の通知をするコマンドを記入

radiru.shは
$ sinyabin.sh チャンネル 録音時間 ファイル名
で録音出来るようになっているので、

録画したい番組毎にsinyabin.sh等を作りその中に、
$ sinyabin.sh チャンネル 録音時間 ファイル名
を記入しています。

radiru.shの中のl-smashでaacをm4aにする際に番組名やアーティスト名などのタグ付けも一緒にやりたいので、sinyabin.sh側であらかじめl-smashで指定するタグのオプションを記入出来ればと思いました。
852 [sage] 2018/04/05(木) 03:41:17.05
radiru.shはaacのダウンロードだけにして、
Pushbulettへの通知、l-smash、Dropboxなどはsinyabin.shの方に書いたほうがいいんでしょうか?
そうすれば、ちょっと録音したいと思ったときいちいち番組毎のスクリプトをつくりその中にIDタグなど細かく書かなくてもすむから楽かなと。
でもそれだと、番組毎のスクリプトに「Pushbulettへの通知、l-smash、Dropbox」といったコマンドを書かないといけないので無駄かなあとも思いました。
どういうフローがいいと思いますか?
名無しさん@お腹いっぱい。 [sage] 2018/04/05(木) 10:10:37.31
export すりゃいいんじゃない
名無しさん@お腹いっぱい。 [sage] 2018/04/05(木) 10:22:06.60
こう質問の仕方が下手だと答える気失せるな
変数外に出せばいいだけ
名無しさん@お腹いっぱい。 [sage] 2018/04/05(木) 10:59:32.39
852だけで良かったのにね
名無しさん@お腹いっぱい。 [sage] 2018/04/05(木) 13:53:42.01
プログラミング素人っぽいし、加減がわかってないだろうから、
情報が多すぎる方は不問にした方が。
足りないよりは多すぎる方がずっとマシ。
名無しさん@お腹いっぱい。 [sage] 2018/04/05(木) 18:12:51.21

radiru.sh に引数でタグ情報を渡せばいいと思いますが。
名無しさん@お腹いっぱい。 [] 2018/04/12(木) 09:36:41.69
bashだと$LINENOでファイルの中での現在の行数が取得できるのですが、
dashやzshだと関数の中にいる時、関数のはじめからの行数になってしまいます。
どうにかして現在の行数を取得する方法はないでしょうか?
名無しさん@お腹いっぱい。 [sage] 2018/04/13(金) 19:02:57.86
zshよくしらんけど、関数定義の手前の行番号を
変数にでも取っといて足し算すりゃいいんじゃね?
名無しさん@お腹いっぱい。 [sage] 2018/04/13(金) 19:07:33.88
まぁやりようは如何様にでもあるんだろうが、
ニュアンス的に$LINENO並の手軽さで取得する手段はないかってことじゃね
俺は知らん
名無しさん@お腹いっぱい。 [sage] 2018/04/13(金) 22:14:56.99
$LINENOってどういう使い方を想定して作ったんだろうね
名無しさん@お腹いっぱい。 [sage] 2018/04/13(金) 22:51:23.99
どこを見ればPOSIXシェルスクリプトの確かな仕様に出会えるのか知らないけど、
ググって出てきたこれにはLINENO書いてあるな。
User Portability Utilities optionが必要みたいだけど、なにそれ?
ttp://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
名無しさん@お腹いっぱい。 [sage] 2018/04/13(金) 23:40:07.60
実装オプションにつけてあるIDコードの一つみたいだな。
コードの一覧は
ttp://pubs.opengroup.org/onlinepubs/9699919799/help/codes.html
にある。

オプション機能なので、実装されてるとは限らない。
名無しさん@お腹いっぱい。 [sage] 2018/04/14(土) 00:40:09.23
LINENOが仕様どおりに実装されてないのは
この際見なかったことにして、現在使われてる
POSIX準拠シェルで完全に実装されてないものなんて有るの?

そもそも現在使われてるPOSIX準拠シェルってどんなのがあるんだろう
bash、ash、dash、zsh、ksh、mksh、yash、posh
他に知ってる?
名無しさん@お腹いっぱい。 [sage] 2018/04/14(土) 16:31:32.55
$LINENO使って何をしたいんだろ
名無しさん@お腹いっぱい。 [sage] 2018/04/14(土) 19:01:06.26
デバッグログ以外になにかあんの?
だからこそデバッグログとして使えない
$LINENOを何のために作ったのか理解できない
名無しさん@お腹いっぱい。 [sage] 2018/04/14(土) 19:14:03.26
${(%):-%I}
名無しさん@お腹いっぱい。 [sage] 2018/04/14(土) 20:10:19.92
$ ${(%):-%I}
-bash: ${(%):-%I}: 誤った代入です
名無しさん@お腹いっぱい。 [sage] 2018/04/17(火) 22:14:01.26
ttps://ja.wikipedia.org/wiki/IOCCC

> ^ Bourne Shellのソースコード( ttp://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh )は
> マクロ( ttp://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/mac.h )を使用した
> 「ALGOLのような見た目のC」で書かれていることで悪名高い
名無しさん@お腹いっぱい。 [] 2018/04/18(水) 10:39:06.43
自己解凍するファイルって便利だな
シェルスクリプトで解凍とインストール手順を記述して
それをバイナリと結合するだけでmsiみたいなことができる
名無しさん@お腹いっぱい。 [sage] 2018/04/18(水) 15:04:27.31

それはちなみに sh アーカイブ形式って呼び名がついてる。
sharっていう自己解凍シェルスクリプト作成専用コマンドも昔はあった。

なお、ウイルスやマルウェアの温床だということで廃れた模様。
名無しさん@お腹いっぱい。 [sage] 2018/04/18(水) 15:22:26.44
sharはそれでインストールまでするというより、tar.gz などのバイナリファイルを
テキストにしてメールやニュースで送るために使うことが多かった
名無しさん@お腹いっぱい。 [sage] 2018/04/18(水) 16:21:07.45

へー、uuencodeしか知らんかった
872 [sage] 2018/04/18(水) 21:50:42.61
あーわりと昔からある手法なのね……
VMware Horizon Clientのインストールイメージがその形で,俺は正直そういうシェルスクリプトとバイナリが結合されてるファイルを始めて触ったんで
画期的なアイデアに思えたんだわ……
名無しさん@お腹いっぱい。 [sage] 2018/04/18(水) 23:47:33.56
echo "1 + 2" | bc > /tmp/a
とすると/tmp/aには2バイト、16進数で
33 0a のデータが入っています。

a=$(echo "1 + 2" | bc)
printf "$a" > /tmp/a
しかしこうすると$aには1バイトしか入ってないようです。

また [ "$(printf '1')" = "$(printf "1\n\n\n\n\n")" ]
これは一致した文字とみなされるようです

こういった挙動はどこを見れば理解できるでしょうか?
名無しさん@お腹いっぱい。 [sage] 2018/04/18(水) 23:55:18.86
a="$(printf '1\n\n\n')"
とやってもaには1しか入っていない

a="$(printf '1\n\n\n2')"
しかしこうすると5バイト入ってる

その状態から a=${a%?} を末尾の2を削除すると
a には4バイト、1\n\n\n が入っている

うーん?
名無しさん@お腹いっぱい。 [] 2018/04/19(木) 00:06:08.07

コマンド置換 $(...) の仕様

ttp://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03
> removing sequences of one or more <newline> characters at the end of
> the substitution. Embedded <newline> characters before the end of
> the output shall not be removed; however, they may be treated as
> field delimiters and eliminated during field splitting, depending on
> the value of IFS and quoting that is in effect. If the output
> contains any null bytes, the behavior is unspecified.

bashのマニュアルにも同様の記述がある

ttp://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBC
> bash は command を実行し、 command の標準出力でコマンド置換の部分を
> 置き換えます。この際、末尾の改行文字は削除されます。 文字列の途中に
> ある改行文字は削除されませんが、 単語分割の際に削除されることがあり
> ます。
名無しさん@お腹いっぱい。 [sage] 2018/04/19(木) 00:06:21.64
かといってこうやると4バイトでてるんだよなー

printf '1\n\n\n' | hexdump.exe -C
名無しさん@お腹いっぱい。 [sage] 2018/04/19(木) 00:19:37.42
コマンド置換の仕様かぁ

普通のやり方ではコマンドの出力結果を変数に入れるときは
末尾の改行は絶対消えるってことかなー
read使えばって思ったけど、あっちは改行区切りだしなー

ちなみに $aに1\n\n\nを無理やり入れて、
$bに1を入れて [ "$a" = "$b" ] で比較したら不一致になったよ
名無しさん@お腹いっぱい。 [sage] 2018/04/19(木) 00:24:31.94
あたりまえやろw
名無しさん@お腹いっぱい。 [sage] 2018/04/19(木) 00:54:10.53
よくこんな単純なルールで辻褄取れてるよなー
思いつきで考えたとしか思えないルールなのにw

勢い5万以上のスレをメールでお知らせするサービス、実施中!!
憧れボディをGETしたい!その夢、ボニックで!

新着レスの表示

2ch勢いランキング アーカイブ UNIX板ランキング

凡例:

レス番

100 (赤) → 2つ以上レスが付いている
100 (紫) → 1つ以上レスが付いている

名前

名無しさん (青) → sage のレス
名無しさん (緑) → age のレス

ID

ID:xxxxxxx (赤) → 発言が3つ以上のID
ID:xxxxxxx (青) → 発言が2つ以上のID

このページは2ch勢いランキングが作成したアーカイブです。削除についてはこちら