为什么 `env` 找不到我的可执行文件?

为什么 `env` 找不到我的可执行文件?

我正在尝试使用 shebang 和/usr/bin/envform 在自定义解释下执行我的脚本。这是我的文件的样子:

$ cat test.rb 
#!/usr/bin/env winruby

print "Input someting: "
puts "Got: #{gets}"
sleep(100)

但执行时失败:

$ ./test.rb 
/usr/bin/env: ‘winruby’: No such file or directory

我不明白为什么

tv185035@WCZTV185035-001 ~
$ winruby --version
ruby 2.5.1p57 (2018-03-29 revision 63029) [x64-mingw32]

tv185035@WCZTV185035-001 ~
$ env winruby --version
env: ‘winruby’: No such file or directory

tv185035@WCZTV185035-001 ~
$ which winruby
/home/tv185035/bin/winruby

存在winruby、位于路径中且可执行。但env找不到它。我看了一下,man env但它没有告诉我任何有用的东西。

编辑:

$ cat ~/bin/winruby 
#!/usr/bin/bash

winpty /cygdrive/g/WS/progs/Ruby25-x64/bin/ruby.exe "$@"

答案1

另一种可能的解决方案:

检查您的 PATH 变量是否未使用“~”来指定路径,因为 env 将无法正确解析它。

因此,举例来说,如果您有

export PATH="$PATH:~/bin"

将其更改为

export PATH="$PATH:$HOME/bin"

答案2

如果输出

echo 1l|ed test.rb

结束于你前面\r$有一个<carriage return><line-feed>

unix 中的行以换行符终止,因此env查找 ' winruby\r' 而不是 ' winruby'。

在 unix 环境中使用vi,ed或编辑脚本nano,并从行末尾删除 '\r'。

编辑:

当我的 PATH 设置但未设置为导出时,我可以创建与您相同的结果。

# PATH is set but not exported
jo@hostname:~/tmp$ winruby --version
running winruby --version
jo@hostname:~/tmp$ env winruby --version
env: winruby: No such file or directory

# print variables starting with PATH
jo@hostname:~/tmp$ set |grep -e ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/jo/tmp/bin

# print exported variables starting with PATH
jo@hostname:~/tmp$ env | grep -e ^PATH

# Oops ! nothing, so exporting PATH
jo@hostname:~/tmp$ export PATH
jo@hostname:~/tmp$ env | grep -e ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/jo/tmp/bin

# Final check
jo@hostname:~/tmp$ env winruby --version
running winruby --version

相关内容