Rc

Stow 不使用 rc 文件中給出的“忽略”選項

  • August 25, 2016

概括

--ignore=<regex>我放入的行.stowrc不起作用。執行 Stow 時,它顯示“正在從 .stowrc 載入預設值”,但它沒有任何效果。但是將這些--ignore=<regex>行直接傳遞給命令是有效的。

問題

假設這個目錄:

user@user-machine:~/test-stow/stow$ tree -a
.
├── a
│   └── car
└── .stowrc

1 directory, 2 files

內容./.stowrc

--ignore='car'

所以我的期望是,stow --verbose=3 a/在該目錄中執行命令等同於stow --ignore='car' --verbose=3 a/./.stowrc文件不存在時執行。

現在我執行:

user@user-machine:~/test-stow/stow$ stow --verbose=3 a
Loading defaults from .stowrc
stow dir is /home/user/test-stow/stow
stow dir path relative to target /home/user/test-stow is stow
cwd now /home/user/test-stow
cwd restored to /home/user/test-stow/stow
cwd now /home/user/test-stow
Planning stow of package a...
Stowing contents of stow/a (cwd=~/test-stow)
Stowing stow/a/car
LINK: car => stow/a/car
Planning stow of package a... done
cwd restored to /home/user/test-stow/stow
Processing tasks...
cwd now /home/user/test-stow
cwd restored to /home/user/test-stow/stow
Processing tasks... done

請注意,這確實會創建指向 的符號連結,./car儘管ignore../.stowrc

現在我通過執行撤消操作stow -D --verbose=3 a/

user@user-machine:~/test-stow/stow$ stow -D --verbose=3 a/
stow dir is /home/user/test-stow/stow
stow dir path relative to target /home/user/test-stow is stow
cwd now /home/user/test-stow
Planning unstow of package a...
Unstowing from . (cwd=~/test-stow, stow dir=stow)
Unstowing stow/a/car
car did not exist to be unstowed
Planning unstow of package a... done
cwd restored to /home/user/test-stow/stow
cwd now /home/user/test-stow
cwd restored to /home/user/test-stow/stow
Processing tasks...

如果我刪除所有內容./.stowrc並執行stow --verbose=3 --ignore='car' a/,我會得到不同的結果:

user@user-machine:~/test-stow/stow$ stow --verbose=3 --ignore='car' a/
stow dir is /home/user/test-stow/stow
stow dir path relative to target /home/user/test-stow is stow
cwd now /home/user/test-stow
cwd restored to /home/user/test-stow/stow
cwd now /home/user/test-stow
Planning stow of package a...
Stowing contents of stow/a (cwd=~/test-stow)
Planning stow of package a... done
cwd restored to /home/user/test-stow/stow
Processing tasks...

./car現在沒有按預期和期望創建符號連結。

怎麼樣$HOME/.stowrc

.stowrc文件放在主目錄中而不是$HOME/test-stow/stow具有相同的效果;car仍然會生成文件的符號連結。

忽略列表

擁有$HOME/test-stow/stow/.stow-local-ignore內容為“汽車”而不是文件的.stowrc文件也不起作用。car仍然會創建指向名為文件的符號連結。


GNU Stow 版本:2.2.0

Perl 版本:perl 5,版本 18

更新

是我對 Adam Spiers 的回答。

感謝您提供出色的錯誤報告!我可以回答你的問題,作為 Stow 的維護者,我也可以解決這些問題,但我希望你能從使用者體驗的角度提供回饋,以便我們找出最佳解決方案。

首先,值得注意的是,--verbose=5它將為您提供有關忽略機制內部的更多詳細資訊,儘管在這種情況下,它不足以解釋為什麼事情沒有按您預期的方式執行。

您的兩個文件都不起作用的原因有兩個.stowrc

  1. 解析器根據.stowrc空格字元拆分 (option, value) 對,而不是基於=. 因此,該文件中忽略選項的行不應以--ignorenot開頭--ignore=
  2. .stowrc解析器不會自動去除引號。當--ignore通過 CLI 傳遞選項(或任何其他選項)時,shell 將在 Stow 看到它們之前去除引號。這就是它在那里工作的原因。

所以這兩者的結合意味著你.stowrc應該包含:

--ignore car

我已經測試過了,確實有效。

現在,可能有有效的論點說這些點中的任何一個甚至兩個實際上都是 UX 錯誤。我當然同意他們不提供直覺的 UI。問題是是否應該改變行為,或者是否最好在文件中更清楚地說明這一點。

我目前的想法是,根據Postel 定律,解析器應該接受空格和的拆分=,但它不應該去掉引號,因為如果使用者真的想忽略'car'而不是僅僅忽略car怎麼辦?還有一個現有的和相關的錯誤報告,帶有空格的選項會中斷stowrc,因此在實施任何修復時都應該考慮到這一點。(發布此答案後,我將更新該錯誤。)

我歡迎你對這些發表意見。

最後,我相信你.stow-local-ignore沒有工作,因為你把它放在 stow 目錄而不是a/package 目錄中。關於這方面的文件對我來說似乎很清楚,所以我認為把它寫成飛行員錯誤是公平的。但是,如果您對如何使文件更清晰有任何建議,那麼我會全力以赴。

再次感謝!順便說一句,將來您可能需要考慮將錯誤報告發送到郵件bug-stow列表(或發送到可怕但道德上正確的 Savannah 錯誤跟踪器不太道德但更有用的 github 問題跟踪器)並向help-stow郵件列表發送幫助請求。是的,我知道對於這樣一個小而安靜的項目來說,這些選擇太多了;那是另一天的 TODO …

引用自:https://unix.stackexchange.com/questions/304830