务与ed通过命令的上流,结果在"没有修改了"

0

的问题

我想添加一条线,我务的文件。 我知道还有其他的方式来解决这个问题,但仍想知道是什么引起的。 运行命令在树莓派3B+、踏踏实实地工精简安装GNU ed1时15、cron3.0pl1-134+deb10u1.

该命令,我被卡住了就是这样的:

$ echo -e 'a\n#asdf\n.\nwQ' | EDITOR=ed crontab -e
902
909
No modification made

我期待它添加行 #asdf 在结束我务文件,但它没有。

设置 EDITOR='tee -a' 作为建议 https://stackoverflow.com/a/30123606/8842387 不解决问题。 所以我想这就是问题与cron。

奇怪的是,当我得到ed命令从键盘直接的,而不是流媒体,它只是工作。 也许子shell建立所引起的问题?

在这里我附上一些最后的线 strace 结果。

$ echo -e 'a\n#asdf\n.\nwQ' | EDITOR=ed strace crontab -e
execve("/usr/bin/crontab", ["crontab", "-e"], 0x7ee54c14 /* 29 vars */) = 0
access("/etc/suid-debug", F_OK)         = -1 ENOENT (No such file or directory)
...
read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\0\0\0\7\0\0\0\0"..., 4096) = 659
_llseek(3, -393, [266], SEEK_CUR)       = 0
read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\0\0\0\7\0\0\0\0"..., 4096) = 393
close(3)                                = 0
getpid()                                = 18579
socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 3
connect(3, {sa_family=AF_UNIX, sun_path="/dev/log"}, 110) = 0
send(3, "<78>Nov 20 15:31:25 crontab[1857"..., 56, MSG_NOSIGNAL) = 56
openat(AT_FDCWD, "crontabs/pi", O_RDONLY) = -1 EACCES (Permission denied)
openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=2995, ...}) = 0
read(4, "# Locale name alias data base.\n#"..., 4096) = 2995
read(4, "", 4096)                       = 0
close(4)                                = 0
openat(AT_FDCWD, "/usr/share/locale/en_GB.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en_GB.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en_GB/LC_MESSAGES/libc.mo", O_RDONLY) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=1433, ...}) = 0
mmap2(NULL, 1433, PROT_READ, MAP_PRIVATE, 4, 0) = 0x76f50000
close(4)                                = 0
openat(AT_FDCWD, "/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
write(2, "crontabs/pi/: fdopen: Permission"..., 39crontabs/pi/: fdopen: Permission denied) = 39
exit_group(1)                           = ?
+++ exited with 1 +++

openat(AT_FDCWD, "crontabs/pi", O_RDONLY) = -1 EACCES (Permission denied) 看起来有点可疑,但不知道为什么它打开了文件的只读。

编辑: 作为建议通过@叮当,我跑了 EDITOR=ed strace crontab -e 看到什么 strace 给一个交互式的会议。 其结果是几乎相同(只有改变在pid和fd数字)。

我注意到,在运行 echo "..." | EDITOR=ed crontab -e 退出消息 No modification made 但与 strace 该进程的停止,没有任何消息。 (EDITOR=ed strace crontab -e 2>&1 | grep "No mod" 打印什么). 猜strace触发不同的错误。

bash cron ed linux
2021-11-20 06:41:51
1

最好的答案

0

跟在我的视觉评论,这些工作对我来说:

( unset VISUAL; printf '%s\n' a '#abcd' . wq | EDITOR=ed crontab -e )
printf '%s\n' a '#abcd' . wq | VISUAL=ed crontab -e

在我的环境、视觉和编辑都设置了"vim"

或者,更多迂回,但是不需要的猴子env var. 这一个也允许你这样做默默:

crontab <(printf '%s\n' a '#asdf' . '%p' | ed -s <(crontab -l))

我在做上。 在Linux上,我可以重现你的意见,但不能解释它们。

一个小的调整到最后命令作品:

printf '%s\n' a '#asdf' . '%p' Q | ed -s <(crontab -l) | crontab -
2021-11-21 20:34:51

谢谢你的回答! 我恐怕要说,无论上述两条线的工作对我来说,最后一个给 /dev/fd/63: Not a regular file. 也许一些系统的结构是不同的?
bivoje

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................