从流水线命令启动编辑器

时间:2014-06-06 09:32:59

标签: shell sh pipeline

我有一个脚本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,以便命令行编辑器仍可用?

2 个答案:

答案 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命令需要解决类似问题并使用此技术:

  1. 它将STDIN中的所有内容写入临时文件

    my ($fh, $tmp)=tempfile();
    print ($fh <STDIN>) || die "write temp: $!";
    close STDIN;
    
  2. 它将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: $!";
    
  3. 启动$EDITOR