作者cuello (cuello)
看板Linux
標題[閒聊] 如何尊重 $EDITIR $VISUAL alternatives?
時間Sun Sep 18 21:44:07 2022
Hi,
最近有次閒逛, 逛到了 /etc/alternatives/
看到裡面有個 editor -> /bin/nano
就馬上想起了前好一陣子, 當我在
# vim /etc/systemd/system/systemd-udevd.service.d/override.conf
板上有人提醒我, 應該
# systemctl edit systemd-udevd
只是, systemd 好像無意尊重我選擇的 editor
因為我的 $EDITOR 跟 $VISUAL 都設為 vim
而且, crontab -e 很配合我的選擇.
但是, systemctl 卻堅持要叫用 nano(1)
我試過把 EDITOR 改為 nono, crontab -e 就也叫的 nano(1).
這很好啊~ 不是嗎? 但是 systemd 就偏偏不配合...
當時, 板上也似乎沒有人想到是甚麼原因它一定要 nano...
最近碰巧撞到了 /etc/alternatives/editor 就隨手
# ln -sf /bin/vim /etc/alternatives/editor
果然, systemctl(1) 就注意到了我要的是 vim...
看起來, 這似乎是近代 Linux 的另外一個「選擇途逕」
把它們全部集中在 /etc/alternatives 來管理
想, 其實也是個不錯的辦法... 可是, 你知道我的問題:
Given 我的 1. EDITOR=vim 2. VISUAL=vim
3. /etc/alternatives/editor -> /bin/nano
那麼, 當一個 developer 需要叫用 editor
而系統環境卻各有不同意見, 他該怎麼做才好?
(P.S. 我跑的是 Debian buster)
regards
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.172.27.91 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Linux/M.1663508649.A.82B.html
1F:→ obarisk: update-alternatives 09/18 22:08
2F:→ obarisk: 寫一個腳本檢查 EDITOR 環境變數給 editor 09/18 22:13
3F:→ obarisk: 此外,systemd edit 用的環境變數是 SYSTEMD_EDITOR 09/18 22:15
4F:→ ChakraLinux: 並沒有,這是Debian系的手段好嗎 09/18 22:55
差點忘了問, 請問大家, 是只有 Debian 才有 /etc/alternatives/ 嗎?
5F:推 holishing: 剛剛查一下 RHEL 最近也出了類似的東西 09/18 23:31
6F:推 holishing: sudo EDITOR=vim systemctl edit servicename.service 09/19 00:05
7F:→ holishing: 剛試一下這樣可以吃到 EDITOR 啊 (CentOS Stream 8) 09/19 00:06
我的 debian buster 也跟你一樣
$ sudo ln -sf /bin/nano /etc/alternatives/editor 恢復原狀
$ sudo EDITOR=vim systemctl edit systemd-udevd 是叫 vim(1) --- [1]
$ sudo systemctl edit systemd-udevd 是叫 nano(1) -------------- [2]
$ sudo echo $EDITOR 是 vim
好! 那,我一定漏掉了甚麼重要的東西沒弄懂..... 請拯救我於水深火熱~
systemctl(1) 接受 [1] 的 EDITOR=vim
systemctl(1) 不認識, 或不接受 [2] bash 已經 export 的 EDITOR=vim
而同時, 如前述, crontab(1) 有 ack 我 export 的 EDITOR=vim
p.s. 換句話說, 假設我用 C 寫了一個程式, 放在 systemctl 的位置
我會有機會在程式裡面「得知」"我" 是 invoked by [1] 還是 [2] 嗎?
8F:→ obarisk: 樓上是對的 SYSTEMD_EDITOR 接下來是EDITOR 09/19 00:20
9F:→ obarisk: man systemctl edit 09/19 00:20
根據裝在我這裡的 manpage.
$SYSTEMD_EDITOR
Editor to use when editing units; overrides $EDITOR and $VISUAL. If
neither $SYSTEMD_EDITOR nor $EDITOR nor $VISUAL are present or if
it is set to an empty string or if their execution failed,
systemctl will try to execute well known editors in this order:
editor(1), nano(1), vim(1), vi(1).
我我對上一段的理解是, systemctl(1) 有意要尊重我的 $EDITOR 跟 $VISUAL
儘管我想不出 $SYSTEMD_EDITOR 存在的必要性跟正當性 (剛檢查過, 我也沒設)
我也尊重 systemctl 作者個人所偏好的 precedence (editor-nano-vim-vi)
但是, 現在, 似乎, systemctl(1) 的行為跟這一段告訴我的不太一致...
※ 編輯: cuello (218.172.27.91 臺灣), 09/19/2022 17:07:47
※ 編輯: cuello (218.172.27.91 臺灣), 09/19/2022 18:09:52
10F:→ oToToT: 你可以想想看下面這幾個的差別 09/19 21:48
11F:→ oToToT: sudo echo $EDITOR 09/19 21:48
12F:→ oToToT: sudo bash -c 'echo $EDITOR' 09/19 21:48
13F:→ oToToT: sudo EDITOR=vim bash -c 'echo $EDITOR' 09/19 21:48
14F:推 lantw44: sudo 預設會重設環境變數,除非你開 sudo -E 或在設定檔 09/20 00:14
15F:→ lantw44: 裡特別設定不要重設,不然大多數環境變數都不會經由 sudo 09/20 00:15
16F:→ lantw44: 往下傳。另外 sudo echo "$EDITOR" 這個變數在你的 shell 09/20 00:15
17F:→ lantw44: 就已經展開了,實際傳給 sudo 的就是 echo vim,無法用來 09/20 00:16
18F:→ lantw44: 確認 sudo 執行程式用的環境變數。 09/20 00:17
19F:推 lantw44: 另外 /etc/alternatives 不是設計來手動修改的,它有設定 09/20 00:21
20F:→ lantw44: 檔,要改應該要用 update-alternatives 指令改。 09/20 00:21
21F:推 Hurricaneger: 4F為什麼你不更新了? 09/20 03:26
以上, 大家所看到的, 真的是一堆人耐心拯救一個執迷不悟的啊~
而且除了仔細看一堆 "s..t" 而且還要花時間打子字
請接受讚美吧!
我來列出自己認為的罪狀
A. 我抱怨 manpage 所寫的跟程式行為不一! 其實正是我自己!
---------------------------------------
因為我文裡雖然到處寫的是:
# systemctl edit systemd-udevd
看起來, 我並沒有真的這麼做,而且一次也沒有!
私底下真的做的是:
$ sudo systemctl edit systemd-udevd
然後,自己一廂情願地畫上等號。然後, 別人也看不見你在搞啥~
像這種錯誤,其實遠比表面上看起來要嚴重的多!
B. 我從來沒有嚴肅對待過 sudo(8)!
----------------------------------------
我跟 sudo(8) 從一開始,所維持的關係是曖眛不明,
得過且過的。本來給自己的理由是:
現在沒空,先做更急迫的吧...
其實反而要浪費更多資源。
雖然,用 sudo(8) 時,一直隱約感覺少了甚麼.....
但是,就一直是繞道來避免眼前的「尷尬」...
真是,「彎道超渡」啊~
這種態度,常遠來看,並沒有省到一點時間!剛好相反!
C. 我隱約對 nano 有偏見,其實預設 nano 是合理的
------------------------------------------------
預設為大多數人的選擇當然是最理性,最節能的做法。
D. 看到又多出了個甚麼 $SYSTEMD_EDITOR 而心生不滿。
-------------------------------------------------
沒必要!結果是,它並沒有干擾到我。可能是為了一個我
短期內還看不到的緣故吧。
E. 還有甚麼呢? ... 喔,我終於做了
$ sudo update-alternatives --config editor
There are 4 choices for the alternative editor
(providing /usr/bin/editor).
Selection Path Priority Status
------------------------------------------------------
* 0 /bin/nano 40 auto mode
1 /bin/ed -100 manual mode
2 /bin/nano 40 manual mode
3 /usr/bin/vim.basic 30 manual mode
4 /usr/bin/vim.tiny 15 manual mode
Press <enter> to keep the current choice[*],
or type selection number: 3
不適合自己這樣做
$ sudo ln -sf /bin/vim /etc/alternatives/editor
這樣不完整,例如 man editor 就沒改到....
不過看起來,我還是有做對一件事,
那就是臨時決定跑上來「閒聊」
其實是「靠杯」~
※ 編輯: cuello (218.172.27.91 臺灣), 09/20/2022 10:04:41
22F:推 holishing: 我也是覺得一直鑽 editor 要怎麼設定很煩, 所以就找一 09/21 19:15
23F:→ holishing: 個成功率看起來最高的方法,就無腦用下去了 09/21 19:15
24F:推 lantw44: SYSTEMD_EDITOR 存在的目的,應該是讓你可以在不同的程式 09/21 21:04
25F:→ lantw44: 用不同的編輯器。前面的 SYSTEMD 就像是 namespace 的功 09/21 21:05
26F:→ lantw44: 能,讓不同程式的設定不會互相干擾。就像是 git 也有 09/21 21:06
27F:→ lantw44: GIT_EDITOR,psql 也有 PSQL_EDITOR 一樣。 09/21 21:06
28F:推 goldie: 對,透過 update-alternative 管理才是正途, 09/24 17:21
29F:→ goldie: 不建議手動改 symlink。 09/24 17:21