使用带有'which'的bash脚本中的命令

时间:2014-05-23 10:01:03

标签: bash

看看bash脚本有时我会看到这样的结构:

MYSQL=`which mysql`
$MYSQL -uroot -ppass -e "SELECT * FROM whatever"

在其他脚本中,直接使用命令(本例中为mysql):

mysql -uroot -ppass -e "SELECT * FROM whatever"

那么,为什么以及何时应该使用which以及哪些命令 - 我从未见过echowhich一起使用...

2 个答案:

答案 0 :(得分:4)

您可以man which了解详细信息:

  

说明

   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中还有另一个clever shortcut来避免which。您可以使用反斜杠调用mysql:

\mysql -uroot -ppass -e "SELECT * FROM whatever"

这将与你的2个命令正在做的实际上相同

来自OP:使用它的唯一原因是为了避免自定义别名可能出现问题(例如alias mysql="mysql -upeter -ppaula")。而且由于人们不太可能为say echo设置别名,因此我们不需要这种带有echo的结构。但是为mysql设置别名是很常见的(没有人想记住并键入24个字符长密码)。

答案 1 :(得分:1)

很大程度上它们都是一样的:

只需which 即可返回二进制文件的绝对路径。当您使用某个第三个程序执行脚本或准备该脚本将运行二进制文件的整个路径的环境时,有时会出现特殊情况。

就像调度程序一样。如果您已经安排了一个脚本,那么您将希望使用具有绝对路径的二进制文件。

因此:

mysql=`which mysql` 

mysql=$(which mysql)

甚至

/usr/bin/mysql <flags>

您的调度程序脚本可能已使用

运行
mysql ....<flags> 

但它不是前一篇文章中解释的保证。别名可能是其中一个原因。

<强> For the kind of problems not using the absolute path can bring, check this link