作者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/cn.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