有时候我看到bash脚本中会出现这样的结构:
MYSQL=`which mysql`
$MYSQL -uroot -ppass -e "SELECT * FROM whatever"
在其他脚本中,命令(在此示例中为mysql
)直接使用:
mysql -uroot -ppass -e "SELECT * FROM whatever"
那么,为什么和何时应该使用
which
?以及对于哪些命令-我从未看到过使用echo
与which
...有时候我看到bash脚本中会出现这样的结构:
MYSQL=`which mysql`
$MYSQL -uroot -ppass -e "SELECT * FROM whatever"
在其他脚本中,命令(在此示例中为mysql
)直接使用:
mysql -uroot -ppass -e "SELECT * FROM whatever"
which
?以及对于哪些命令-我从未看到过使用echo
与which
...您可以使用man which
来查看详细信息:
DESCRIPTION
which returns the pathnames of the files (or links) which would be executed in the current environment, had its arguments been given as commands in a strictly POSIX-conformant shell. It does this by search‐ ing the PATH for executable files matching the names of the arguments. It does not follow symbolic links.
因此,which mysql
只返回当前 mysql
命令的路径。
然而,在您的示例中使用 which
确保忽略当前环境中设置的任何 mysql
别名。
但是,在 shell 中有另一种聪明的方式可以避免使用 which
。您可以使用反斜杠调用 mysql:
\mysql -uroot -ppass -e "SELECT * FROM whatever"
alias mysql="mysql -upeter -ppaula"
)可能出现的问题。而且由于很少有人会为echo
设置别名,我们不需要使用echo的这种构造方式。但是为mysql
设置别名非常常见(没有人想记忆和输入24个字符长的密码)。它们大部分是相同的:
只是which
会返回二进制文件的绝对路径。有时候,当你在使用第三方程序执行脚本或准备脚本运行环境时,整个二进制文件路径会很方便。
例如,在调度程序的情况下,如果你已经安排了一个脚本,那么你将需要使用其绝对路径的二进制文件。
因此:
mysql=`which mysql`
或者
mysql=$(which mysql)
或者甚至
/usr/bin/mysql <flags>
mysql ....<flags>
php
调用,则通常需要绝对路径:exec('/usr/local/bin/mysql -uroot -ppass -e "SELECT * FROM whatever"');
(当然你不会在 php 中使用 exec
调用 mysql
…) - AvL
which
返回该命令的路径。我的问题是,为什么和何时需要它。which echo
返回/bin/echo
,但没有人在echo
中使用这种构造。 - AvLwhich
一起使用?我不想在我的 bash 脚本中包含一个带有所有使用which
包装的命令的 反向别名文件... - AvLwhich
的唯一原因是避免与自定义别名(如alias mysql="mysql -upeter -ppaula"
)可能出现的问题。由于很少有人会为echo
等设置别名,所以我们不需要使用这种echo
构造。但是为mysql
设置别名非常常见(没有人想记住并输入长达24个字符的密码)... - AvLwhich
的好用例:在脚本的开头(或者在一个额外的 .config 文件中)加入MYSQL=\
which mysql`,这样用户就可以调用不同于默认安装的
mysql,将
which mysql替换为例如
/Applications/XAMPP/xamppfiles/bin/mysql`。 - AvL