从bash脚本

时间:2016-10-30 11:25:00

标签: bash

有没有办法创建一个bash脚本,在运行时会向命令行提供一些文本(要执行的命令)并将光标放在末尾?

所以它不应该执行命令,只有按下[Enter]键才会发生。我只是希望能够有时更改命令中的一些参数。

示例:

    # ./do_command.sh
    # some__very_long_command_with_plenty_of_params param1 param2 param3 | <- and the cursor 
is here waiting for me to just approve hitting the [Enter] or possibly tweak the params before doing so

到目前为止我所拥有的只是脚本回显命令,需要我复制粘贴它。

2 个答案:

答案 0 :(得分:1)

不确定只能使用Bash完全实现此目的。可能需要终端应用程序的一些其他功能。

我能想到的选择:

  • 使用可选参数为每个非常长的命令编写一个带有大量参数的Bash函数。该功能还可以打印命令并要求确认;

例如:

myfunc() {
   param1=${1:default1}
   param2=${1:default2}
   cmd="command --param $para1 --param $param2"
   echo running $cmd
   read -p "<ENTER> to run, <CTRL-C> to abort"
   $cmd
}
  • 使用文本完成工具,例如DashTextExpander,当您编写特定的字符序列时会提示您输入参数,并在按 ENTER时写入结果

  • 使用带有在线扩展的Bash别名:使用大量参数为每个很长的命令创建一个别名,然后键入别名,但不要按Enter(还),按 CTRL-ALT -E ;该行将展开,您将能够查看,修改,然后按 ENTER

例如:

$ aliase myfunc="command --param 1 --param 2"
$ myfunc <CTRL-ALT-E>
$ command --param 1 --param 2
  • 使用带有主题标签的永久历史&#39;:使用带有大量参数的非常长的命令运行命令一次,但是以注释结束以给该行命名&#39;。然后,您可以使用 CTRL-R 搜索名称(&#39;#标签&#39;)

例如:

$ command --param 1 --param 2 # myfunc

然后输入 CTRL-R my

(reverse-i-search)`my': command --param 1 --param 2 # myfunc

检索命令。

答案 1 :(得分:0)

read实际上只是cmd="some__very_long_command_with_plenty_of_params" args=("foo bar" "param2" "param3") read -e -i "$(printf '%q' "$cmd"; printf ' %q' "${args[@]}")" cmd eval "$cmd" 命令的包装器。

eval

通常,不应使用eval,但在这里,您特意尝试执行任意命令,这是bash旨在执行的操作。这并不比直接在-e提示符下输入命令更危险。

read命令告诉-e使用Readline库编辑命令行(就像常规提示一样)。 printf提供默认值。 eval命令确保以可以使用%q命令重用的方式打印命令名称和默认参数。请注意foo bar不使用引号;它使用反斜杠来仅转义必须转义的字符,因此参数foo\ bar显示为"foo bar",而不是'foo bar' **output$sumy** <- renderTable({ input$action if(is.null(input$action)) return(NULL) else isolate({ trees2 <- FindTreesCHM(fchm(), (as.numeric(input$fws)), (as.numeric(input$minht))) h <- trees2["height"] TotalArvores <- nrow(trees2) rbind(summary(h), TotalArvores, make.row.names = "Total number of trees") }) }) output$downSumy <- downloadHandler( filename = function() { paste("Summary of LiDAR metrics", "csv", sep = ".") }, content = function(file) { write.table(**input$sumy**, file, sep = ",") } )