Stow 不使用 rc 文件中給出的“忽略”選項
概括
--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
:
- 解析器根據
.stowrc
空格字元拆分 (option, value) 對,而不是基於=
. 因此,該文件中忽略選項的行不應以--ignore
not開頭--ignore=
。.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 …