Shell脚本管道:有或没有xclip的不同行为

时间:2011-09-12 06:44:30

标签: bash shell zsh pipeline

我有一个名为password-for-object的脚本,我通常会这样运行:

$ password-for-object example.com
sOtzC0UY1K3EDYp8a6ltfA

即。它执行复杂的哈希计算并输出密码,我在访问名为example.com的对象(例如,网站)时应该使用该密码。我只需双击整个密码,就会将其复制到我的缓冲区中,然后将其粘贴到表单中。

我还学会了如何在不使密码可见的情况下使用这样的脚本的技巧:

$ password-for-object example.com | xclip

这样,脚本的输出最终会出现在X的主缓冲区中,我可以将其直接插入到表单中的密码字段中,并且它不会显示在屏幕上。

这种方式唯一的问题是password-for-object输出一个带尾随换行符的字符串,因此“xclip”总是会捕获一个额外的符号 - 这个换行符。如果我在password-for-object中省略了换行符的输出,那么我最终会遇到没有xclip的混乱字符串,即当我把它放在标准输出上时。我使用2个shell:zsh和bash,我将在zsh中获得以下内容(注意额外的%符号):

$ password-for-object example.com
sOtzC0UY1K3EDYp8a6ltfA%
$

或者bash中的以下内容(注意提示将在同一行开始):

$ password-for-object example.com
sOtzC0UY1K3EDYp8a6ltfA$

有关如何解决此问题的任何想法?是否有可能以某种方式修改脚本,以便检测到xclip在管道中,如果不是则只输出换行符?

2 个答案:

答案 0 :(得分:2)

如果您更改password-for-object以便它不输出换行符,您可以使用以下脚本调用它:

#!/bin/bash
password-for-object "$1"
if [ -t 1 ]
then
    echo
fi

-t条件在the bash manual中描述为:

  

-t fd

     

如果文件描述符fd已打开并且引用终端,则为真。

请参阅以下问题:

答案 1 :(得分:1)

尝试一下:

$ password-for-object example.com | tr -d '\n' | xclip

tr -d'\ n'删除换行符