【问题标题】:printing string into command line like it's a new command将字符串打印到命令行中,就像它是一个新命令一样
【发布时间】:2020-09-03 10:57:03
【问题描述】:

我想为带有默认参数的长命令创建一个快捷方式,这样我就可以将命令带入命令行,然后自己添加或更改参数。

例如使用命令wget:

print "wget -O downloaded.file"

将导致:

user@hostname$ wget -O downloaded.file

然后我添加我想下载的“url”:

user@hostname$ wget -O downloaded.file http://example.com/

【问题讨论】:

  • 我建议使用别名 (help alias) 或函数 (help function)。
  • @DanielZabelin 您在对答案的评论中解释了其他要求。请edit您的问题并在那里添加所有要求。添加一个显示更困难用例的示例,即编辑参数而不是仅附加参数。您是否考虑过使用命令历史记录?您可以搜索先前的命令并根据需要对其进行编辑。如果不能使用,请说明原因。

标签: linux bash command-line printing


【解决方案1】:

alias my_personal_wget_shortcut="wget -O downloaded.file"

之后会添加其他参数:

my_personal_wget_shortcut http://example.com/

使用函数或 shell 脚本,您可以将参数放置在您喜欢的任何位置:

功能:

my_personal_wget_shortcut()
{
    wget -O downloaded.file "$@"
}  

脚本:

#!/bin/bash
wget -O downloaded.file "$@"

别忘了在脚本上设置 x 位!

【讨论】:

  • 建议使用比替换短的快捷方式。
  • 感谢您的回答,但它是我已经尝试过的解决方案之一,它不能解决我的问题。我使用长命令来自动执行任务,我希望它直接打印到我的命令行的原因之一是因为我想添加默认参数,然后在需要时更改它们。
  • @DanielZabelin :为什么我的解决方案不涵盖此应用程序?如果您执行alias w= -O downloaded.file,则可以执行w add any argument you want。出于各种原因,我个人更喜欢函数而不是别名,但别名就可以了。
  • @user1934428 正如我所说,我想对可以轻松更改的命令使用默认参数,其中一些参数包括数组、文件、整数或只是基本标志,所以它会更多很难在脚本/函数/其他别名中更改它们。
  • 我明白了。然后将其作为函数或脚本执行,而不是作为别名。您问题中的示例仅显示添加参数。如果您在为脚本定义默认参数时遇到问题,我建议您为此提出一个新问题。这是一个新问题,值得单独讨论,因为有几种方法可以解决这个问题。
【解决方案2】:

我的答案基于https://unix.stackexchange.com/a/82716/330217https://unix.stackexchange.com/a/325220/330217 的解决方案。

你也可以从https://unix.stackexchange.com/a/391698/330217那里得到一些想法


bash 的干净方式,但需要按下光标向上:

您可以将“假”命令放入bash 的命令历史记录中使用

history -s 'some command'

(见https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Bash-History-Builtins

将命令放入历史记录后,您可以按向上光标键将此命令放入命令缓冲区并根据需要进行编辑。

当然你可以使用别名作为快捷方式。

alias myalias="history -s 'wget -O downloaded.file '"

myalias

按下光标后你应该得到

wget -O downloaded.file _

注意:下划线 (_) 用于在尾随空格之后显示光标位置。


直接填充命令缓冲区的更多hacky解决方案:

writecmd () { 
  perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ chomp($_ = <>); $_ }' ; 
}

# Example usage
echo 'my test cmd' | writecmd

与别名结合

writecmd () { 
  perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ chomp($_ = <>); $_ }' ; 
}

alias myalias="echo 'wget -O downloaded.file '|writecmd"

myalias

应该直接导致

wget -O downloaded.file _

注意:此解决方案的缺点是它还将命令打印到标准输出。这意味着该命令也出现在提示符之前。(我不知道是否可以抑制这一点。当我将stdout重定向到/dev/null时,该命令将不再写入命令缓冲区。)


zsh 中,您可以使用print -z 将某些内容放入命令缓冲区。

alias myalias="print -z 'wget -O downloaded.file '"

【讨论】:

  • 谢谢! zsh 方式像我需要的那样工作,但我并没有真正使用 zsh,而 perl 方式导致打印字符串 2 次,如下所示:wget -O downloaded.file user@hostname$ wget -O downloaded.file
  • @DanielZabelin 我刚刚强调了说明这个缺点的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
  • 2011-04-09
  • 2014-12-03
  • 2019-04-23
  • 1970-01-01
相关资源
最近更新 更多