2013-05-14 82 views
3

我有一個使用process substitution差異,當符號鏈接使用

的腳本是一個shell腳本:

#!/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是映射到/bin/bashsoft-link

$ 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.sh因爲sh執行是一個符號鏈接/bin/bash

任何見解將不勝感激。謝謝。

+0

我猜你是不執行的bash,因爲'/ bin'在'$ PATH'中的'/ usr/bin'之前,'/ bin'中有'sh'程序。 – Lennart

+0

但是'哪個sh'顯示'/ bin/sh'指向'/bin/bash'...thus不應該是'/ bin/bash'被執行?謝謝 – Bill

+0

嗯。但很明顯,sh和bash不執行相同的程序。 – Lennart

回答

4

當作爲sh調用時,bash在讀取啓動文件後進入posix 模式。在posix模式下不識別過程替換。根據posix,<(foo)應該從名爲(foo)的文件中直接輸入。 (嗯,這是,根據我的標準的閱讀語法是模糊的,在許多地方。)

編輯:從bash manual

The following list is what’s changed when ‘POSIX mode’ is in effect: 
... 
Process substitution is not available. 
+1

由於'sh'是一個到'bash'的符號鏈接(請參閱我的問題中'which'和'ls -l'的輸出),不應執行'sh'命令調用'bash'?我不關心爲什麼'sh file.sh'給出錯誤,但是當'sh'是到'bash'的符號鏈接時,爲什麼'sh file.sh'不等於'bash file.sh'。謝謝。 – Bill

+1

@Bill'sh file.sh'給出錯誤*,因爲*'sh file.sh'不等於'bash file.sh'。 'bash'只是簡單地解析和執行相同的腳本,當它被調用爲'sh'而不是'bash'時。 – chepner

+0

@WilliamPursell因爲'sh'是符號鏈接到'bash',不應該'bash'被執行?這就是符號鏈接的含義,如果我沒有錯......請在問題中查看'which'和'ls -l'的輸出。謝謝 – Bill