我有一个脚本myscript
,它收集一些信息,将它们放在一个临时文件中,在该文件上启动$EDITOR
并等待用户完成。类似于git commit
打开$EDITOR
以允许您输入提交消息时所发生的情况。
基本上myscript
是
salt=$(collect_salt_from_various_sources)
password=$(openssl passwd -salt $salt $$)
tempfile=$(mktemp)
printf "username=CHOOSE A NAME\npassword=$password\n" > $tempfile
$EDITOR $tempfile
# read data from $tempfile
我想在管道中使用我的脚本,以便从stdin接收信息:
# "aabbcc" will be used as part of the salt
echo "aabbcc" | myscript
这里的问题是命令行编辑器(例如Vim,Nano)不能再访问终端而用户无法输入(几乎)任何东西。
有没有办法从流水线脚本启动$EDITOR
,以便命令行编辑器仍可用?
答案 0 :(得分:0)
我不确定你想如何修改你的shell脚本,但我同意你不能使用vim或nano的管道...除非你在命令的末尾添加-
!
echo "foo" | $EDITOR -
这适用于nano和vim。
第二次机会:
经过多次尝试,我使这个脚本工作(我希望这或多或少是你想要的结果):
#!/bin/sh
echo $tempfile | vim -R -
它被称为:
echo "foo" | sh myscript.sh
唯一令人讨厌的事情是我无法从vim中删除此消息:
Vim: Reading from stdin...
答案 1 :(得分:0)
来自moreutils的vipe
命令需要解决类似问题并使用此技术:
它将STDIN中的所有内容写入临时文件
my ($fh, $tmp)=tempfile();
print ($fh <STDIN>) || die "write temp: $!";
close STDIN;
它将STDIN和STDOUT重定向到/dev/tty
open(STDIN, "</dev/tty") || die "reopen stdin: $!";
open(OUT, ">&STDOUT") || die "save stdout: $!";
close STDOUT;
open(STDOUT, ">/dev/tty") || die "reopen stdout: $!";
启动$EDITOR