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


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

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



1 名前:シェルスクリプトライター mailto:sage [2011/12/10(土) 20:06:40.38 ]
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。

□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
 FreeBSDユーザは/bin/shの正体がashなので注意。
 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
  src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/
  heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
 (理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。

前スレ
シェルスクリプト総合 その18
hibari.2ch.net/test/read.cgi/unix/1308195527/

次スレは >>970 で。

764 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/07(土) 22:52:59.06 ]
>>762
find . ! -readable | wc -l
でダメ?

765 名前:sage [2012/04/10(火) 19:58:25.17 ]
for i in {1..10}; do command 1> ${i}.txt 2> ${i}.log &; done

とかやると,
[1] + suspended (tty output) ...
とかなって処理が終了しない.なぜぇ・・・


766 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/10(火) 21:04:40.05 ]
それはね…

767 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/11(水) 08:00:04.70 ]
>>765
面白いと思う

768 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/12(木) 09:02:11.67 ]
;が邪魔だって文句いわれたから、
はずして実行したら {1..10}.txt とかできたぞ
どうしてくれる

マジレスすると、commandの中身なによ

769 名前:sage [2012/04/12(木) 10:33:02.93 ]
Cで書いたプログラムだね.

770 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/12(木) 19:19:17.01 ]
commandはシェルビルトインコマンドでしょ

771 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/12(木) 19:30:36.07 ]
というか、>>765 実行してもそういう現象は起きないので、
回答欲しかったらもっと具体的に "how to repeat" 書いてくれ

772 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/12(木) 21:09:49.38 ]
>>765
そのcommandのプログラムがSIGTTOUをSIG_DFLに戻してしまってるんだろ。
普通ならシェル側でSIGTTOUはSIG_IGNにするからsuspendはしないようになってる。



773 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/12(木) 21:25:50.42 ]
>>771
Steps to Reproduce だろ

774 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/12(木) 21:34:14.02 ]
>>773
How to repeatで合ってる。というか、そんなところに突っ込んでも面白くない。

775 名前:名無しさん@お腹いっぱい。 [2012/04/12(木) 22:19:43.60 ]
再現性の話ならreproduceがふつー


776 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/12(木) 22:24:50.96 ]
SIGTTOUについて答えられない奴が持論の英語を主張して話題逸そうとしてるなw

777 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/12(木) 22:27:19.83 ]
「バグの出し方」と書かれてる文章に、
「バグの再現手順」だろ? と突っ込んでるようなモン。

778 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/12(木) 23:01:56.84 ]
GNUのバグトラッキングシステムがHow-To-Repeatってフィールド使ってるね
www.gnu.org/software/gnats/doc/3_113_1/gnats_1.html

779 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/13(金) 06:11:12.98 ]
>>765
エスパーするとzshの最近のバージョンでのバグ。

780 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/13(金) 14:26:30.54 ]
w3m &
で起きる奴とおんなじ.どうすればいいんだろ・・

781 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/13(金) 14:34:14.58 ]
何のこと?

782 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/13(金) 14:44:26.87 ]
>>781

>>768の件.



783 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/13(金) 14:44:40.34 ]
>>780
set +m
で、ジョブコントロールを無効にすれば桶。
ただ、シェルスクリプト中から起動すればデフォで set +m 状態なんだがな。
コマンドラインから直接起動してるのか。

784 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/14(土) 21:01:39.51 ]
どこに書いていいのかわかんないから、ここに書いてみる。
shell script書いててはまったんだけど、
 ls -l /etc | sort -k4 -n
がファイルサイズでソートしてくんない。
こんな↓感じで、なんか部分的にしかソートしてくれないみたい。
dpaste.org/ri4On/

バグ?
理由を知ってる人がいたら教えてちょうだい。

環境: debian squeeze
$ uname -a
Linux bauhaus 3.2.0-2-rt-686-pae #1 SMP PREEMPT RT Fri Apr 13 02:23:30 JST 2012 i686 GNU/Linux
$ sort --version
sort (GNU coreutils) 8.5

785 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/14(土) 21:09:58.78 ]
>>784

sort -k5 -n だろ

786 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/14(土) 21:10:24.24 ]
まぁ、ls -Sで良いんじゃないのか

787 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/14(土) 21:15:57.76 ]
>>784
> 理由を知ってる人がいたら教えてちょうだい。
使い方が間違っている。

788 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/14(土) 21:18:22.79 ]
0番目から数えたくなる気持は分からなくもない

789 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/14(土) 21:26:12.51 ]
いや、だって、man sort したら、
-k POS1[,POS2]
-K POS1[,POS2] ソートフィールド指定の POSIX 形式。今後はこちらが
推奨される。行の POS1 から POS2 までのフィールドを指定する。
POS2 を含む。 POS2 が省略されたら行末まで。 フィールドと文字位置
はそれぞれ 0 から数えはじめる。
て書いてあったんだもん。
それを何も考えず信じたのでした。

LANG=C man sort だと、
-k, --key=POS1[,POS2]
start a key at POS1 (origin 1), end it at POS2 (default end of line)
てなってるのね。
確かに -k5ならソートしてくれたよ。

なんだかスレ汚し失礼しました。

790 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/14(土) 21:34:49.42 ]
本当だ。普段manpageは英語のものしか見ないから気付かなかった。

791 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 01:03:11.15 ]
俺もだまされた。
さすが Linux とおもた。

792 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 01:13:16.43 ]
Linuxの日本語manはまったく整備されてないからなぁ



793 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 01:18:04.06 ]
alias man='LANG=C man'
しとくのオススメ

794 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 01:20:40.59 ]
$ man sort じゃなくて $ info sort がオヌヌメ

795 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 02:33:57.03 ]
Linuxの日本語 manと言えば、最近 bash 4.2の manが
翻訳されたのが嬉しかった。

GNU bash 4.2 の翻訳
linuxjm.sourceforge.jp/INDEX/gnu.html#GNU_bash

796 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 11:22:51.82 ]
コマンド foo と同名の関数 foo を作成し、後者の中から前者を呼び出そうと思っています。
function foo {
 foo
}
しかし当然ながら無限ループになります。
解決策としては
function foo {
 `which foo`
}
という方法があります。
しかし毎回 which コマンドを起動するのがちょっと気にかかります。
別の方法として
function foo {
 ¥foo
}
というのを試しましたが、だめでした。¥foo はエイリアスには効くけど関数にはききませんでした。
というわけで、今のところ which コマンドを使う方法しかなさそうですが、もっといい方法があれば教えて下さい。

797 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 11:26:42.70 ]
>>796
function foo {
 command foo
}

そのための「command」コマンド。

798 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 12:24:24.87 ]
話は変わるけど、bashには`help'という組み込み関数があって、

bash$ help function

とか

bash$ help command

とかするとその部分の説明文だけ表示してくれる

799 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 13:24:53.76 ]
単に
/usr/bin/foo
とかすればいいんじゃないの?

800 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 13:34:57.91 ]
>>799
最適解(>>797)が既に出てるのに、外した回答するオマエは黙ってろ。

PATHが違ったら適応できないだろw

801 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 16:01:28.21 ]
>>799のレスは別に問題視するようなものじゃない。
〜の方が良いと書いてあれば別だが。

802 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 16:16:51.47 ]
>>801
>>796 の質問で、わざわざ `which foo` と書いてることから、
絶対PATHで書いたのでは問題の解決にならないことは読みとれる。
質問者自信も絶対PATHを使う方法は知っている(けどそれじゃ駄目)と読みとれる。

質問の回答になってないのだから問題視されてもしょうがない。



803 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/16(月) 01:51:19.72 ]
>>801
>>799みたいなトンチンカンな回答にも丁寧に答えてあげている
>>800の優しさに気づけ

804 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/17(火) 15:40:51.44 ]
>>797
「command」なんて初めて知りました。完璧です。ありがとうございました。

>>802
状況としてはまったくそのとおりで、すばらしいエスパーっぷりですが、
799はそこまで敵視されるようなことを書いてるわけじゃないので、
そんなに怖がらせなくてもいいかなと思いました。
技術者同士はみんな仲良くね!戦うべき相手は別にいるよ!

805 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/17(火) 16:49:46.48 ]
>>800は常駐さんのお決まりレスです。
彼なりにイカしたレスだとお考えになっているのでしょう。
しばらくここにいれば慣れます。

806 名前:名無しさん [2012/04/23(月) 01:47:23.08 ]
検索コンプレックス

807 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/28(土) 14:15:07.91 ]
関数もexportできるようにならないかなぁ
環境変数ならぬ環境関数みたいな
便利だと思うんだけど

808 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/28(土) 14:19:23.03 ]
>>807
え? できるけど。

export -f

809 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/29(日) 08:45:26.54 ]
>>808
bash乙

810 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/29(日) 09:44:51.95 ]
      ____
     /      \
   /  _ノ  ヽ、_  \
  /  o゚⌒   ⌒゚o  \   不毛な言い争いがまた始まるお…
  |     (__人__)    |
  \     ` ⌒´     /


811 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/29(日) 10:46:16.86 ]
キミの好物じゃないの

812 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/29(日) 17:13:31.08 ]
>>808
ほんとだ、bashだとexport -fでできるのね
zshだと駄目なんだけどオプションが違うんだろうか



813 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/29(日) 17:16:47.95 ]
zshは今誰も使ってないからバグが放置されてるんじゃないか?

814 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/29(日) 18:14:30.17 ]
>>813
そうなんだぁ・・・
いっそbashに戻ろうかな

815 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 03:50:24.36 ]

質問です。

複数のコマンドの実行結果をソートしたいですが、うまくいきません。例えば、
イメージ的には以下のような感じ。

{
cat FILE_A
find PATH1 -print
find PATH2 -print
find PATH3 -print
} | sort > FILE_A

以下を試しました

find PATH1 -print >> FILE_A
find PATH2 -print >> FILE_A
find PATH3 -print >> FILE_A

cat FILE_A | sort > FILE_A

こうすると最後の FILE_A のファイルに結果がすべて出力されず尻切れになり
ます。


816 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 03:59:02.05 ]
zshかbash系だとして一行で済ますなら
$ cat <(find PATH1) <(find PATH2) <(find PATH3) | sort

$ cat < FILE_A | sort > FILE_A
が失敗するのはまあそんなものだと思っておけばいい。
同じファイルから読み込んで出力するのは失敗する。

$ cat < FILE_A | sort > FILE_B
ならおk

817 名前:名無しさん@お腹いっぱい。 [2012/05/06(日) 04:09:18.13 ]
(rm FILE_A; sort > FILE_A) < FILE_A
みたいな手もあるが、間違えたら泣ける。


818 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 04:15:04.88 ]
同じ条件で検索するなら
find PATH1 PATH2 PATH3 | sort
でいいよな。

819 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 05:15:17.42 ]
>>815
> cat FILE_A | sort > FILE_A
マルチタスクな OS では普通パイプやリダイレクトの際に前後の
プロセスが同時に起動する。
ファイルを読むプロセスが終了するのを待ってファイルを書くプ
ロセスが起動する訳ではない。

なので、上記の場合は最後に書き込むファイル名を変更しなければならない。

820 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 14:36:51.94 ]
TEMP=`tempfile`
cat FILE_A > "$TEMP"
find PATH1 -print >> "$TEMP"
find PATH2 -print >> "$TEMP"
find PATH3 -print >> "$TEMP"
sort "$TEMP" > FILE_A


821 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 14:53:36.25 ]
すみませんが添付ファイルは梨の奉公でお願いします

822 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 15:27:35.80 ]
>>815
www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html#sort-invocation
cat FILE_A | sort -o FILE_A




823 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 16:20:24.14 ]
>>822
catとパイプが無駄です。

sort -o FILE_A FILE_A

824 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 17:20:10.08 ]
ランダルシュワルツの不要なcat添削を思いだした

825 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 18:55:31.70 ]
cat議論はこのスレの>>147-213あたりで延々やってるな。

826 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 19:22:02.88 ]
添付ファイルを使わないのは大手SIerじゃ常識だね。

827 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 19:23:49.29 ]
思案パイプ

828 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/07(月) 19:19:08.78 ]
対話方式にならないようにシェルスクリプト自信がroot権限で実行されるようにするスクリプトって作れますか?

829 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/07(月) 21:03:44.73 ]
>>828
対話的コマンドでもexpectでなんとかなる

830 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/07(月) 21:11:42.22 ]
>>829
そういう意味じゃなくて、シェルスクリプト中で su -c hoge とかしないで
root権限の動作をさせたいという質問かとエスパー。

831 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/07(月) 21:16:30.15 ]
基本的にsuidはシェルスクリプトでは許可されてないからねえ。
昔あったsuidperlみたいなののbash版を探してみたけどないみたいだし。
sudersに対象となるスクリプトに対してNOPASSWDを設定するぐらいしか思いつかないや。


832 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/08(火) 02:00:49.38 ]
>>828
できます
コマンドラインを実行するだけのプログラムを作って
setuidするば



833 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/08(火) 07:52:21.31 ]
>>832
>>831

834 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/09(水) 13:22:49.97 ]
forum.xda-developers.com/showthread.php?t=540483
ここに書いてあるシェルスクリプトを動かしてみたんですが、
Syntax error: "do" unexpectedと返されてしまいます
ヒントだけでもいいんで教えてください。



835 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/09(水) 13:28:11.27 ]
-x 付けて実行してどこでエラーか見てみたら
bash -x secrets.sh

836 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/09(水) 13:29:47.52 ]
>>835
わからないなら黙ってろ

837 名前:835 mailto:sage [2012/05/09(水) 13:30:45.77 ]
あ、スレ間違えてたorz

838 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/09(水) 15:17:41.55 ]
なぜかしら、回答としては合ってる気がするぞw

839 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/10(木) 06:54:48.81 ]
コピペの際に文の末尾に\rが入っちゃってるとか。

840 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/14(月) 22:36:21.02 ]
alias cd=chdir
function chdir {
if [ -r "$1" -a -d "$1" -o "$1" = "" ] ; then
local i
for i in 8 7 6 5 4 3 2 1 0 ; do
dirstack[$i+1]=${dirstack[$i]}
done
dirstack[0]=`pwd`
\cd $1
fi
pwd
}
function ds {
echo "p:"`pwd`
local i
for i in 0 1 2 3 4 5 6 7 8 9 ; do
echo "$i:${dirstack[$i]}"
done
}
bash用のをcsh(tcshですが)に書き換えてもらえないでしょうか。

841 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/14(月) 22:36:59.98 ]
function bd {
dirstack[10]=`pwd`
\cd ${dirstack[0]}
local i
for i in 0 1 2 3 4 5 6 7 8 9 ; do
dirstack[$i]=${dirstack[$i+1]}
done
pwd
}
function nd {
dirstack[10]=`pwd`
\cd ${dirstack[9]}
local i
for i in 8 7 6 5 4 3 2 1 0 ; do
dirstack[$i+1]=${dirstack[$i]}
done
dirstack[0]=${dirstack[10]}
pwd
}


842 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/15(火) 09:15:03.98 ]
pushd じゃダメなん?



843 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/15(火) 16:36:43.46 ]
>>842
体に馴染んでるんで…すいません

844 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/16(水) 16:34:35.79 ]
もっとマシな方法ありますか?考えても、これくらいしか思いつかない。
デフォルトのBourne Shellではチルダ展開がないようなので、posix shellにて
チルダ展開が必要な場合がある、ファイル名に空白等を含んだものが、パラメータに入っているとして、
file_name="~/src/te st"
echo "${file_name}をチルダ展開しlsします。\n"
ls -l "$( eval echo -n ${file_name} )"


845 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/16(水) 16:40:45.81 ]
lsに限らず、それ以外でも扱える、方法が知りたいです。

846 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/16(水) 17:10:41.70 ]
>>844
例が悪い。その1番下の行の
ls -l "$( eval echo -n ${file_name} )"
だって、複数の空白が空白1個にまとめられちゃうし、
$ < > 等の記号が含まれると ${file_name} (クォートなし)の展開と
evalの展開で大変なことになるぞ。

847 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/16(水) 17:30:39.54 ]
>>846 確かに、例は悪いだろうな。大変なことになる。
でも考えても、これくらいしか思いつかなかったので、
いい加減にして、聞いた方が早いかと書き込んだんだよ。


848 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/16(水) 17:34:06.75 ]
シェル変数内にチルダが入っている時、チルダ展開だけやって
その他の空白とか * $ < > とかの解釈はさせないって方法がないんだよな。
sedでチルダを $HOME に書き換えろ。

849 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/16(水) 17:46:31.95 ]
>>844
file_name="~/src/te st * $ < >"
ls -l "${file_name/\~/$HOME}"

850 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/16(水) 18:49:13.65 ]
>>846, >>848, >>849 あああ!ありがとう。
ls -l "$( echo -n "${file_name}" | sed s#^~#$HOME# )"

851 名前:844 mailto:sage [2012/05/16(水) 21:00:34.05 ]
しばらく考えてこうしました。
ls -l "$( [ "${file_name%%/*}" = "~" ] && echo "$HOME/${file_name#~/}" || echo "${file_name}" )"

if [ "${file_name%%/*}" = "~" ]
then ls -l "$HOME/${file_name#~/}"
else ls -l "${file_name}"
fi


852 名前:名無しさん@お腹いっぱい。 [2012/05/18(金) 05:23:42.76 ]
v7shについて色々調べてるのですがどうしても関数を使用しようとすると

test.sh: syntax error at line 2: `(' unexpected

とエラーが出てきて使用できません。空白、頭にfunctionを付ける等いろいろ試してみましたがやはり変わらず・・・
UNIX version 7の頃のshには関数がないということでしょうか?



853 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 05:27:04.29 ]
sage忘れました。申し訳ないです。

854 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 06:51:13.40 ]
>>852
シェル関数はないよ。

代用として、シェル関数にしたい内容をシェル変数に入れて、その変数を実行する。

func='ls -l'
$func

で ls -l が実行される。引数を渡したい時は工夫して。

855 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 07:00:59.45 ]
>>852 あんまり役に立たないかも知れないですが、無いと思います。
参考までに
1. Bourne Shell Tutorial
www.grymoire.com/Unix/Sh.html
The original version of the Bourne shell didn't have functions. If you wanted to perform an operation more than once, you either had to duplicate the code, or create a new shell script.

2. Linux におけるシェルの進化
www.ibm.com/developerworks/jp/linux/library/l-linux-shells/?cmp=dw&cpb=dwlin&ct=dwrss&cr=dwrss&ccy=jp&csr=012012
ただし、関数を定義する機能は欠けていました。

3. 知っている限りでは、ここが一番情報が多い
traditional Bourne shell family / history and development
www.in-ulm.de/~mascheck/bourne/
The Variants
A summary of the most important changes
? Version 7 (1979) control structures, cmd substitution, () and {}, arbitrary variable names, trap, eval, special parameter substitutions, case
? System III (1981) #, [!...], colon parameter substitution, set --
? SVR1 (1983) shift n
? SVR2 (1984) functions, built-ins: unset echo type, redirection for builtins

4. 3の下の方のSource codeにある、Nikola Vladov のマニュアルで、
man v7sh
BUGS Coexists with but doesn't understand shell functions.

5. FreeBSD Portsはよく分かりませんが、
v7sh FreeBSD
www.freebsdsoftware.org/shells/v7sh.html
functions aren't supported and command line input is not 8 bit clean

856 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 15:41:41.74 ]
>>854
>>855
ありがとうございます!やっぱりなかったんですね

case文で;;を使用してもcase文抜けられないのも仕様なのかなぁ
マニュアル読んだら使用できそうではあったんですけども・・・一応使用したテストスクリプト上げておきます。
#!/usr/local/bin/v7sh
case $1 in
a)
echo "A!!"
;;
b)
echo "B!!"
;;
c|d)
echo "C or D"
;;
[e-h])
echo "E kara H"
;;
*)
echo "NANIKORE?"
;;
esac
で結果が以下のようになりました。
$ test.sh a
A!!
NANIKORE?

857 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 16:34:52.98 ]
仕様じゃね?
ソースあるんだから読んで解析してくれ
読みにくいってレベルじゃないけど

858 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 20:07:10.23 ]
>>856 なんででしょうね?
そのままコピペしてv7shで試しましたが、こちらでは期待通りの動作でした。
$ ./v7case.sh a
A!!
$

859 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 22:31:03.13 ]
>>858
謎ですね・・・v7shなんて過去のものですから大差があるとは考えにくいですし

通常のコマンド待ち状態で ;; を打つとエラーが出ますから
case内でしか特殊な意味を持たないと思われるんですけどね・・・

860 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/24(木) 17:44:12.51 ]
msysgit(windows版git)付属のbashでログイン時のディレクトリをホーム以外にしたいんだけど、どうしたらいい?
例えば、$HOME/work/hogeでいつも作業するのでbash起動時にそこにいて欲しい。
$HOMEを書きかえると他にも影響があり過ぎるので別の方法教えてください。

適切なスレが見つからなかったので、誘導して。

861 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/24(木) 18:49:28.23 ]
etc/profileの最後にcd ~/work/hoge?

862 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/24(木) 20:59:36.08 ]
そんな単純なことでよかったのか...
恥ずかしいー



863 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/24(木) 21:28:32.29 ]
$HOME/.bash_profileの方が良いんじゃ?

864 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/25(金) 02:08:36.57 ]
かなり遅れましたが>>834です
-xをつけて実行してみたところ、
# bash -x secrets.sh
+ echo -n
: Invalid argument: apks.txt
+ echo -n
: Invalid argument: output.txt
secrets.sh: line 5: syntax error near unexpected toke' `do
'ecrets.sh: line 5: `do
以下のようになりました。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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