簡體   English   中英

帶有進程替換的 shell 腳本中的語法錯誤

[英]Syntax error in shell script with process substitution

我有這個 shell 腳本,我用它來備份我的系統。 有一行:

tar -Pzcpf /backups/backup.tar.gz --directory=/ --exclude=proc --exclude=sys --exclude=dev/pts --exclude=backups --exclude=var/log / 2> >(grep -v 'socket ignored' >&2)

如您所見,我一直試圖通過 tar 過濾掉煩人的、無用的“忽略套接字”錯誤,使用這篇博文

我在執行時從 shell 得到的是:

/bin/sysback:第 45 行:意外標記附近的語法錯誤>' /bin/sysback: line 45: tar -Pzcpf /backups/backup --directory=/ --exclude=proc --exclude=sys --exclude=dev /pts --exclude=backups --exclude=var/log / 2> >(grep -v '忽略套接字'>&2)'

您使用的語法是基本 shell 語法的 bash 擴展,因此您必須小心使用 bash 運行腳本。 (Ksh 也有>(…)進程替換,但在重定向后不支持它。Zsh 會很好。)

鑒於您收到的錯誤消息,您正在 bash 中運行此腳本,但在其 POSIX 兼容模式下,而不是在完整的 bash 模式下。 注意使用顯式#!/bin/bash行調用腳本。 #!/bin/sh不會,即使/bin/sh是到 bash 的符號鏈接,因為如果 bash 以sh名稱調用,則 bash 在 POSIX 模式下運行。 如果您使用 bash 功能,請始終按名稱調用 bash。

如果要使用 bash 功能,還要注意不要設置環境變量POSIXLY_CORRECT或在命令行上傳遞--posix選項。

或者,不要使用這種特定於 bash 的語法; 使用可移植的構造,例如Stephane Rouberol提出的構造

怎么樣:

 tar -Pzcpf /backups/backup.tar.gz --directory=/ \
     --exclude=proc --exclude=sys --exclude=dev/pts \
     --exclude=backups --exclude=var/log 2>&1 | grep -v 'socket ignored'

我發現在 gentoo 上,如果 sh 是 /bin/bash 的鏈接,如果您使用 'sh "scriptname"' 調用腳本,它不會將其作為 bash 腳本運行,並且會失敗:

matchmorethan.sh: line 34: syntax error near unexpected token `<'
matchmorethan.sh: line 34: `done < <( cat $matchfile )'

因此,如果您需要使用進程替換功能,則需要專門使用 bash 運行它。 但我沒有找到任何對此的參考。

實際上,當 GNU tar 提供忽略“忽略套接字”警告的選項時,您不必在 std 錯誤中進行此類重定向。

tar --warning='no-file-ignored' -Pzcpf /backups/backup.tar.gz --directory=/ --exclude=proc --exclude=sys --exclude=dev/pts --exclude=backups --exclude=var/log / 2> new.err

您可以在此處找到帶有更多忽略選項的原始鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM