[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 06/25 22:56 / Filesize : 258 KB / Number-of Response : 1042
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 17:54:23.25 .net]
シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)もしくはPOSIX準拠の互換シェルがデフォルトです。
 bash/zsh/ksh/ash/dash/yash/poshなどの専用機能に依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
 FreeBSDユーザは/bin/shの正体がashなので注意。
・POSIXについてのリンクは https://en.wikipedia.org/wiki/POSIX にまとめられています
 最新の仕様はこちらへ pubs.opengroup.org/onlinepubs/9699919799/
 (左上の「Shell & Utilities」 から参照することができます。)
・v7 shに一番近くて、現役(?)のshは、OpenSolaris由来のheirloom sh。
  src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/
  heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
 (理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
 「そういうのはperl使いましょう」と回答するのはやめましょう。
 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
 質問に対して問題が間違ってるといちゃもんをつけるのもやめましょう
前スレ シェルスクリプト総合 その26
https://mevius.5ch.net/test/read.cgi/unix/1489979246/

621 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 11:34:13.17 .net]
$ cat <<. <<.
1AAA
.
2BBB
.
とやると
2BBB
とだけ出力されるんだけど、これどういう理屈か分かる?
標準入力ってヒアドキュメントでさえ上書きされる仕様なの?

622 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 11:42:05.35 .net]
strace で見ると 2BBB だけ read してるな(1AAA は無視)。

623 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 12:01:06.03 .net]
>>598
なるほど。だから「さいごに〜」とか話に全く関係ないことを言い出したのねw

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

cat < /proc/loadavg < /proc/uptime
ってかいて、/proc/uptime からしか読み込まないのと一緒だと思うよ

624 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 12:22:00.85 .net]
>>595
0x03e8 ばんさえとれればあなたのしょうりです。

625 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 16:23:41.49 .net]
>>601
なるほどね
$ somecmd < a.file < b.file
↑これでb.fileしか読み込まれないのも(やったことなかったから)知らなかった。
ありがとう

626 名前: []
[ここ壊れてます]

627 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 16:51:47.47 .net]
リダイレクトは引数じゃないからね
実質これと同じわけだし

exec </proc/loadavg
exec </proc/uptime
cat

628 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 17:56:57.18 .net]
>>604
なるほど、納得

629 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 18:05:22.98 .net]
>>593
を〜、grep -oで切り出しできるのね
久々にこのスレで参考になりました



630 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 18:44:51.04 .net]
なんか嫌らしい感じ

631 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 18:54:32.62 .net]
コロンを含むディレクトリを$PATHに登録した場合ってどういう挙動になるんだろう

632 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 20:11:28.93 .net]
コロンがセパレータなのでそこで分かれる

633 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 20:52:33.17 .net]
findでexecオプションの引数のあとにシェルに渡すパイプを付けるとexecに渡したコマンドがシグナル13パイプ破壊を出してくるんですけど
どうにかなりませんかね。
今のところ/dev/nullに標準エラー出力を捨てることで解決してるんですけども。
find . -exec basename \{\} \; | head
↑これで再現するはずです。
解決するときはできればPOSIXの範囲でやりたいです。findのGNU拡張で解決できるならそれでもいいんですが
メインPCがOS Xなので、最低でもBSD拡張、さらに言えばPOSIXに限定してほしいです すいません。

634 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 21:25:25.31 .net]
macOSだが再現しないなあ

635 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:13:02.03 .net]
FreeBSDは再現しない。
CentOSは再現した。
対策は後で考える。

636 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:18:48.70 .net]
なにか最近やけに POSIX にこだわってる奴が多いが同一人物か?

637 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:31:37.92 .net]
>>613
単純にPOSIXの価値というかシェルスクリプト全体の有用性が見直されているだけでは
たとえば*BSDのスレでGNUライセンスに拘ったレスが連続するのはおかしいが
BSDライセンスを重視するスレがたくさんあっても別におかしくはないだろう

638 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:32:42.05 .net]
パイプでなのでfindとhead が同時にプロセスとして存在
findが標準出力に出力するとパイプを通して/パイプとして繋がってるheadの標準入力に入力として
headが目的を達して終了=パイプが無くなる、だがしかし、findは出力を続けようとし出力しようとしたらパイプが壊れてるうううっ

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

findとheadが直接は繋がっていなくてかもしれんが。パイプの送出側がSIGPIPEを無視って謎動作なのは変わらないかな

639 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:38:09.62 .net]
>>615
basenameが標準出力につながってるだけだから、findはwriteしないのでSIGPIPEを受け取らないよ。
basenameが事故死したのをfindが報告してるだけ。

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

あとはまかせた。



640 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:41:30.04 .net]
>>616
そのへんが実装によりちょっと違うってとこなのかなあ。出る出ないは

641 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:48:28.09 .net]
>>613
自分側で「なにか違って」動かなかったらめんどくさいってだけじゃないの、単に

642 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:49:53.08 .net]
>>610

643 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:50:38.44 .net]
CentOS$ strings /bin/find | grep -i signal
signal
%s terminated by signal %d
FreeBSD$ strings /

644 名前:usr/bin/find | grep -i signal
なんもなし

以上、findのおせっかい度の差。
[]
[ここ壊れてます]

645 名前:619 mailto:sage [2018/06/14(木) 22:51:53.48 .net]
すまん間違えて送信しちゃった
$ find /etc -exec sh -c 'basename {}' \; | head
これでどうだろう。
-quitオプションはPOSIXの範疇ではないけどこれはPOSIXに準拠してる
ちなみに>>610のコマンドラインはDebian GNU/Linuxのfind 4.7で再現した。

646 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:55:42.54 .net]
>>619,620
なーるほどっ
ww
なるほどっ、なっとく

647 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:57:07.67 .net]
>>621
ん? それSIGPIPEは回避できるけど別の問題が発生しない?
「basename: 余分な演算子 XXX」←みたいに怒られるんだが
あと
$ find /etc -exec sh -c 'echo {}' \; | head
↑これをやるとやっぱりSIGPIPEが出されるようだ。

648 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 00:01:24.90 .net]
>>613
どこかの先生が課題にそう書いてるんだろう。
ちゃんと調べないで持ってくるバカ学生が多いんじゃないの。

649 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 00:03:14.56 .net]
>>610
>findでexecオプションの引数のあとにシェルに渡すパイプを付けるとexecに渡したコマンドがシグナル13パイプ破壊を出してくるんですけど

この動作は、POSIX的にはどうなの?
まずいというならPOSIX的にどうまずいの?



650 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 00:08:14.14 .net]
find . -exec basename \{\} \; | { head; cat >/dev/null; }

651 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 00:14:45.23 .net]
>>626
どういう仕組みなん?

652 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 00:39:45.42 .net]
-execにこだわりがないのであれば、
find . -print0 | xargs -0 -L 1 basename | head
今度はxargsがお節介メッセージ出すけど、findはheadが終了したら終了する

653 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 01:01:37.95 .net]
xargs(1)に-0オプションはない(POSIX厨)

654 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 02:22:41.09 .net]
findにも-print0は無いけどな。BSDにもあるからいいんじゃね

655 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 08:25:40.13 .net]
find . -print | xargs -n1 basename 2>/dev/null | head

656 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 20:58:34.50 .net]
execオプションはやめといたほうがいいね

657 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 21:35:58.85 .net]
元々何が気に入らなかったのかイマイチわからない

658 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 22:35:17.99 .net]
POSIX的に気に入らない

659 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 23:11:38.57 .net]
POSIX POSIXうっせー



660 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 23:13:05.02 .net]
>>634
こういうPOSIXにやたらこだわってるのって
なにかの精神障碍があるんじゃないの?
一度そういう病院で診てもらえ。

661 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 00:18:50.65 .net]
findutilsのソース取って来てあのメッセージ出ないようにパッチして使っちゃえよもう
git.savannah.gnu.org/cgit/findutils.git/tree/find/exec.c?h=v4.6.0#n354

662 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 00:33:50.14 .net]
>>616
find . -exec sh -c 'trap "exit" pipe; basename {}' \; -o -quit | head

663 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 01:07:40.99 .net]
>>638
試してないけど、trapせずにbasenameのあとにexitするだけでだめなん?

664 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 08:33:03.61 .net]
find /etc -exec basename \{\} \; |& head
これでエラーも出ず余計な出力も引っ掛らなかったんだけど
理屈が分からん
|& は標準出力と標準エラー出力両方を通すはずなので
SIGPIPEのエラーが出力されるはずだがgrepしても見当らない

665 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 10:03:37.06 .net]
find自身がSIGPIPEで終了してんじゃない
実行時間も短くなってるし

666 名前:640 mailto:sage [2018/06/16(土) 10:31:40.54 .net]
>>641
すいません。それどうやって確かめたらいいですかね

667 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 10:39:12.35 .net]
Linux なら strace で見ると分かる

$ strace -f bash -c 'find /etc -exec basename \{\} \; |& head'

668 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 11:10:29.82 .net]
stderrが(標準出力)のパイプになりの、そのパイプが無くなり、find自身がエラーメッセージをそれに書き込もうとしてSIGPIPEを受けるってとこか
find . -exec basename {} \; -o -print | head
としても同じように終わるってとこで

669 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 12:55:30.00 .net]
>>644
ほほう



670 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 13:02:42.26 .net]
>>640
だれかこれをmacOSでやってくれない?
あれは確かSIGPIPEを受けとらないから
GNU findと違ってこの書き方だと不具合が起こりそうだ

671 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 13:15:44.53 .net]
>>646
>あれは確かSIGPIPEを受けとらない
いや、それはないだろう。単に>>621の違いじゃないの
macOS Sierra標準のbashはまだ |& をサポートしてないヤツみたいなので(??)、2>&1 | としたが同じくfindは終わる

672 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 13:16:47.78 .net]
>>647
× >>621
>>620

673 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 13:26:10.67 .net]
ああ、|& は元々はzshのなのか(?)
macOS Sierra標準のzshでは/でも、>>640のままで特に何も問題なく終わった

674 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 14:10:29.68 .net]
>>649
|&はcsh由来。zshはパクっただけ。

675 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 17:20:45.43 .net]
|&はPOSIXなの?

676 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 17:32:28.45 .net]
やかましいわっw、おばかさん

677 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 17:58:54.17 .net]
それはPOSIXですか?POSIXじゃないのですか?

678 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 18:00:34.28 .net]
ところで俺のPOSIXを見てくれ。こいつをどう思う?

679 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 18:14:03.11 .net]
すごく、標準的です



680 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 18:39:24.01 .net]
Is it POSIX?

681 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 18:58:44.20 .net]
No, it is Apple

682 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 19:58:16.75 .net]
まあPOSIXじゃないので質問者の要請は満たしてないよね
俺が提案するとしたらexecは使わず
find . | xargs -I @ basename @ | head
↑これ。

683 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 20:06:12.48 .net]
それじゃあかんだろ。xargsのオプションが足りない

684 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 20:09:55.36 .net]
いいのか。すまん

685 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 20:37:42.14 .net]
俺がやるなら xargs -I には {} を 指定するがな
@というのは見たことがない 社内規約かなにかかな?

686 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 20:51:48.06 .net]
>>656-657
定冠詞がないよ

687 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 20:56:44.95 .net]
この問題って本質的には、 find は /etc の下の全部のファイル(10以上)を返すが、
head は 10行で打ち切ってしまうという矛盾にある。
そこは目をつぶるって方針なんだから、最初に書いてあったstderrを捨てるって
方法で正しいと思うよ

688 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 20:59:20.95 .net]
>>658
xargs: basename: terminated by signal 13 って表示されちゃう
>>661
俺は @ しか使ったことがない

689 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 21:30:02.51 .net]
>>662
バッカこれはどっちも形容詞だよ
だからネタとして成立してんじゃん



690 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 22:02:52.02 .net]
>>662
マジレスアッポー

691 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 23:19:14.74 .net]
コマンドの重複を数える(つまり$PATHに登録され実行可能なファイルの重複を列挙する)一番短い方法をってなんでしょう。ただし確実に動作しかつ可搬であることが条件です。
僕が考えたのは
$ echo $PATH | tr ':' '\n' | xargs -I @ find @ \( -type f -a -perm -+x \) -exec basename \{\} \; | sort | uniq -c
です。

692 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 23:24:18.70 .net]
basenameにしたらファイル名じゃなくなるじゃん

693 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/16(土) 23:36:17.54 .net]
>>668

もしかして-type fが見えてないだけ?

694 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 04:18:06.91 .net]
パスの中に空白が入ってる or PATHの中身が多すぎたらおそらくアウト
( IFS=:; find $PATH -type f -a -perm -+x ) | sed 's|.*/||g' | sort | uniq -c

( IFS=:; for i in $PATH; do find "$i" -type f -a -perm -+x; done ) | sed 's|.*/||g' | sort | uniq -c

695 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 08:19:10.40 .net]
できればsedでやりたいことなんですが
aaa
<<
bbb
>>
もしくは
aaa
<<bbb>>


696 名前:ニいうようなファイルがあったとしてaaaの次行から「>>」を含む行までを読み出したいです。
(aaaが存在する行はすでに具体的な数値で判明しています; ここでは42行目とします)
特に二番目の場合には sed -n -e '43,/>>/p'とやると43行目に「>>」があるのに見つけてくれません。
なにか手助けをおねがいします。
[]
[ここ壊れてます]

697 名前:名無しさん@お腹いっぱい。 [2018/06/17(日) 09:24:18.61 .net]
>>671
sed -e '42,/>>/!d' -e 42d

698 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 12:39:57.71 .net]
あれんじ
sed -e '43,$!d;/>>/q'

699 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 14:39:23.57 .net]
標準規約に従いましょう

GNU Coding Standards
https://www.gnu.org/prep/standards/standards.html



700 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 14:43:41.30 .net]
言いたいことがわからない

701 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 16:46:05.17 .net]
言っても無駄なんだろうが、そんなファイルを処理しようってのが間違ってると思う

702 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 19:18:43.97 .net]
>>676
処理したい時はどうすればいいですかね。

703 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 19:23:59.83 .net]
POSIXで。

704 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 19:24:04.76 .net]
Windowsだと%TEMP%で一時ファイルの格納場所が指定できますがUnixではそういう環境変数はないのですか?
$TEMPとか

705 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 19:27:47.07 .net]
>>669
basenameって拡張子消えるよね?

706 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 19:28:33.83 .net]
>>679
誰に対して使用して欲しいのか分からないな

707 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 19:40:16.19 .net]
>>680
消せと言えばね

708 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 19:43:21.15 .net]
>>679
TMPDIR
かな
/tmp
が古からあるからな。TMPDIRが設定されていたら(OSとして初期設定されているか、なんらかの形でTMPDIR設定されてたら)TMPDIR。設定されてなかったら普通に /tmp かな

709 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 19:45:54.91 .net]
>>679,683
>TMPDIRが設定されていたら〜
って、TMPDIRを意識していればね。当然のように、んなの知らん、/tmp 一択ってのも普通にある



710 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 20:07:00.69 .net]
>>681
一応、TMPDIRはPOSIX標準環境変数らしい。 tmpfile(3)やmkstem(3)なんぞはPOSIXとしてはTMPDIRを参照しろとはなってないらしい
が、実装するならTMPDIR参照するだろうし、してる。ちゃんとtmpfile(3)やmkstem(3)やmktemp(1)などを使っていれば、誰でもなんだろうけどね

711 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 20:58:57.79 .net]
>>685
それってPOSIX shellの話なの?

712 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 21:18:57.03 .net]
シェルじゃなくてシステム

713 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 21:19:01.81 .net]
>>686
何を聞いてるのかわからん

714 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 21:19:45.24 .net]
俺…POSIXだったのか…?

715 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 21:59:03.03 .net]
関数のなかってalias使えないっぽいね
somefnc() {
  alias AAA='pwd'

  AAA
}
# → AAA: command not found

716 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/17(日) 23:04:57.63 .net]
6.6 Aliases
...
Aliases are expanded when a function definition is read, not when the function is executed, because a function
definition is itself a compound command. As a consequence, aliases defined in a function are not available until
after that function is executed.

somefnc () { alias AAA='pwd'; }
somefnc
AAA
otherfnc () { AAA; }
otherfnc

717 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/18(月) 03:25:19.77 .net]
aaa="cat /etc/*release | grep -E '^NAME='"
echo ${aaa}

上を実行すると、
$ ./hoge.sh
cat /etc/os-release | grep -E '^NAME='
こうなってしまいます。
cat 〜の結果をaaaに入れる方法教えて欲しいです。

718 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/18(月) 03:35:59.29 .net]
自己レス
evalで出来ました

719 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/18(月) 07:01: ]
[ここ壊れてます]



720 名前:47.43 .net mailto: >>690
関数の中でaliasが使えないと言うよりか、
関数の定義が実行された時点でのalias情報が反映される。

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

だからsomefunc()関数定義文よりも前にaliasが設定されていれば
そのとおりに展開されるが、関数の中はすでにalias展開済みなので
もう処理されない
[]
[ここ壊れてます]

721 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/18(月) 07:11:33.65 .net]
ちなみにこれだとうまくいく

somefnc() {
  alias AAA='pwd'

  eval AAA
}

evalは実行する段階でalias展開されるようだ
evalで実行する文は、実行段階ならないと
わからないのだから当然ではあるが






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<258KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef