3

使用するシェルスクリプトがありますprocess substitution

スクリプトは次のとおりです。

  #!/bin/bash
  while read line
  do
    echo "$line"
  done < <( grep "^abcd$" file.txt )

を使用してスクリプトを実行するとsh file.sh、次の出力が得られます

$sh file.sh
file.sh: line 5: syntax error near unexpected token `<'
file.sh: line 5: `done < <( grep "^abcd$" file.txt )'

を使用してスクリプトを実行するbash file.shと、スクリプトが機能します。

興味深いことに、shは にsoft-linkマップされ/bin/bashます。

$ which bash
/bin/bash
$ which sh
/usr/bin/sh
$ ls -l /usr/bin/sh
lrwxrwxrwx 1 root root 9 Jul 23  2012 /usr/bin/sh -> /bin/bash
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 648016 Jul 12  2012 /bin/bash

次を使用して、シェルでシンボリックリンクがたどられていることを確認するためにテストしました。

$ ./a.out
hello world
$ ln -s a.out a.link
$ ./a.link
hello world
$ ls -l a.out
-rwx--x--x 1 xxxx xxxx 16614 Dec 27 19:53 a.out
$ ls -l a.link
lrwxrwxrwx 1 xxxx xxxx 5 May 14 14:12 a.link -> a.out

は へのシンボリック リンクであるため、なぜsh file.shが実行されないのか理解できません。/bin/bash file.shsh/bin/bash

どんな洞察も大歓迎です。ありがとう。

4

1 に答える 1

4

sh として呼び出された場合、bash は起動ファイルが読み取られた後に posix モードに入ります。プロセス置換は posix モードでは認識されません。posix によると、<(foo)という名前のファイルから直接入力する必要があります(foo)。(まあ、つまり、私の標準の読みによると。文法は多くの場所であいまいです。)

編集:bashマニュアルから:

The following list is what’s changed when ‘POSIX mode’ is in effect:
...
Process substitution is not available.
于 2013-05-14T19:20:23.750 に答える