Bash"命令未找到"错误

boo*_*oof 2 unix bash

我正在尝试使用自定义函数编辑我的.bashrc文件以启动xwin.我希望它能够在多个窗口中打开,所以我决定创建一个接受1个参数的函数:显示数字.这是我的代码:

function test(){
    a=$(($1-0))
    "xinit -- :$a -multiwindow -clipboard &"
}
Run Code Online (Sandbox Code Playgroud)

我创建一个变量"a"来保存输入的原因是因为我怀疑输入是作为字符串而不是数字读入的.我希望采取我将输入减去0的步骤将字符串转换为整数,但我不确定它是否会.现在,当我打电话的时候

test 0
Run Code Online (Sandbox Code Playgroud)

我收到了错误

-bash: xinit -- :0 -multiwindow -clipboard &: command not found
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?谢谢!

bis*_*hop 6

因为整个引用的命令充当命令本身:

$ "ls"
a b c
$ "ls -1"
-bash: ls -1: command not found
Run Code Online (Sandbox Code Playgroud)

摆脱围绕你的双引号xinit:

xinit -- ":$a" -multiwindow -clipboard &
Run Code Online (Sandbox Code Playgroud)


Gor*_*son 6

除了主教指出的双引号外,这个函数还有其他几个问题:

  • test是一个标准的,非常重要的命令.不要重新定义它!如果这样做,您可能会冒一些脚本(或源文件,或其他)运行:

    if test $num -eq 5; then ...
    
    Run Code Online (Sandbox Code Playgroud)

    这将触发xinit一些随机窗口号,然后继续脚本,好像$ num等于5(无论它是否实际上是).这种方式就是疯狂.

  • 正如chepner在评论中指出的那样,bash并没有真正的整数类型.对它来说,整数只是一个恰好只包含数字的字符串(前面可能是" - "),因此转换为整数是非运算的.但你可能想要做的是检查参数是否被取消.您可以检查是否$1为空(例如if [[ -z "$1" ]]; then echo "Usage: ..." >&2etc),或者提供例如默认值${1:-0}(在这种情况下,默认使用"0").

  • 最后,不要使用function关键字.bash容忍它,但它是非标准的,并没有做任何有用的事情.

所以,这是我得到的功能的清理版本:

launchxwin() {
    xinit -- ":${1:-0}" -multiwindow -clipboard &
}
Run Code Online (Sandbox Code Playgroud)


小智 6

这是因为bash将引号内的所有内容解释为String.命令是一个字符串数组,第一个元素是二进制文件或内部shell命令.数组中的后续字符串将作为参数.

键入时:

"xinit -- :$a -multiwindow -clipboard &"
Run Code Online (Sandbox Code Playgroud)

shell认为你写的所有东西都是命令.根据您运行的命令/程序,所有其余参数可以是单个字符串.但是,大多数情况下,只有当你传递一个内部有空格的参数时才使用引号:

mkdir "My Documents"
Run Code Online (Sandbox Code Playgroud)

这将创建一个名为My Documents的目录.此外,你可以逃避像这样的空间.

mkdir My\ Documents
Run Code Online (Sandbox Code Playgroud)

但请记住,"$"是一个特殊字符,如"\".它被shell解释为变量.在执行之前,"$ a"将被其值替换.如果使用简单的引号('$ a'),它将不会被shell解释.

此外,"&"是在后台执行命令的特殊字符.你应该把它传递到引号之外.