Bash 找不到expr命令?为什么找不到expr,但其他的都找到了?

Bash 找不到expr命令?为什么找不到expr,但其他的都找到了?,bash,Bash,我花了几个小时试图使下面的代码工作 PATH="C:\Ben\MyPictures" echo $PATH MY=`expr 2 + 2` 但这将不起作用,因为“未找到expr:command”。我对StackOverflow的唯一了解是路径问题(即设置我的环境变量),但如果这是问题所在,为什么其他函数(如echo、let和declare)可以正常工作 为了了解更多的上下文,这是一个近乎全新的window的cygwin安装。我的问题是为什么我找不到expr?您已将路径修

我花了几个小时试图使下面的代码工作

    PATH="C:\Ben\MyPictures"
    echo $PATH
    MY=`expr 2 + 2`
但这将不起作用,因为“未找到expr:command”。我对StackOverflow的唯一了解是路径问题(即设置我的环境变量),但如果这是问题所在,为什么其他函数(如echo、let和declare)可以正常工作


为了了解更多的上下文,这是一个近乎全新的window的cygwin安装。我的问题是为什么我找不到expr?

您已将
路径修改为只有一个目录(因此它找不到
expr
)。必须将新路径附加到
path
中,而不能替换现有的
path
值,如下所示:

export PATH="$PATH:C:\Ben\MyPictures"
也可以使用bash的内置算术计算,而不是调用外部进程
expr

$ echo $((2+2))
4
编辑:

是的,这些文件可以工作,因为它们不是从
$PATH
中列出的目录中找到的可执行文件

相反,它们(
echo
type
等)是由
bash
shell本身提供的功能,称为shell内置

键入
Type echo
Type expr
以了解它是什么类型的命令(别名/shell内置/可执行文件等)

Shell内置帮助通常可以通过
help shellBuiltin
找到,因为我们使用可执行文件的
man
页面


PS:
type
本身是一个内置的shell(请参见
type

您已将
路径修改为只有一个目录(因此它找不到
expr
)。必须将新路径附加到
path
中,而不能替换现有的
path
值,如下所示:

export PATH="$PATH:C:\Ben\MyPictures"
也可以使用bash的内置算术计算,而不是调用外部进程
expr

$ echo $((2+2))
4
编辑:

是的,这些文件可以工作,因为它们不是从
$PATH
中列出的目录中找到的可执行文件

相反,它们(
echo
type
等)是由
bash
shell本身提供的功能,称为shell内置

键入
Type echo
Type expr
以了解它是什么类型的命令(别名/shell内置/可执行文件等)

Shell内置帮助通常可以通过
help shellBuiltin
找到,因为我们使用可执行文件的
man
页面


PS:
type
本身是一个内置的shell(请参见
type

路径变量
path
用于查找环境附带的标准二进制文件的位置。事实上,系统环境变量通常是大写的(例如
HOME

在您的命令中:

PATH="C:\Ben\MyPictures"
您意外(或有意)将标准二进制文件的标准路径替换为
C:\Ben\MyPictures
,因此命令解释器bash here无法再找到
expr
。当您使用大写变量时,例如PATH,您可以执行以下操作:

if [ -z "$PATH" ] #check if a variable is empty
then
PATH="C:\Ben\MyPictures"
else
PATH="$PATH:C:\Ben\MyPictures"
fi
更好的选择是使用小写字母表示用户定义的变量:

path="C:\Ben\MyPictures"
#in this case you should not get an error for expr but
# I am not sure how a Linux-Like environment handle character case.
# check that out.

path变量
path
用于查找环境附带的标准二进制文件的位置。事实上,系统环境变量通常是大写的(例如
HOME

在您的命令中:

PATH="C:\Ben\MyPictures"
您意外(或有意)将标准二进制文件的标准路径替换为
C:\Ben\MyPictures
,因此命令解释器bash here无法再找到
expr
。当您使用大写变量时,例如PATH,您可以执行以下操作:

if [ -z "$PATH" ] #check if a variable is empty
then
PATH="C:\Ben\MyPictures"
else
PATH="$PATH:C:\Ben\MyPictures"
fi
更好的选择是使用小写字母表示用户定义的变量:

path="C:\Ben\MyPictures"
#in this case you should not get an error for expr but
# I am not sure how a Linux-Like environment handle character case.
# check that out.

which expr
显示什么?对于bash(和POSIX)shell,您还可以使用
MY=$((2+2))
语法。它目前没有显示任何内容。我只想让代码在不崩溃的情况下运行。将
:/bin:/usr/bin
添加到当前的
路径
应该可以恢复功能(假设您的
expr
位于正常的
/usr/bin/
中,
哪个expr
显示了什么?对于bash(和POSIX)shell,您还有
MY=$((2+2))
语法也可用。它当前没有显示任何内容。我只想让代码在不崩溃的情况下运行。将
:/bin:/usr/bin
添加到当前
路径
应该可以恢复功能(假设您的
expr
位于正常的
/usr/bin/
中,这是非常合理的。我将在早上尝试,如果是的话,将授予最佳答案。这确实有效。我仍然不明白的一件事是为什么“expr”为什么不“echo”。甚至在更改path变量时让和声明仍然有效。这是非常合理的我会在早上尝试,如果是的话,会奖励最佳答案。这确实有效。我仍然不明白的一件事是为什么“expr”和为什么不“echo”。即使让和声明在更改path变量时仍然有效。