请教$的用法

sh/bash/dash/ksh/zsh等Shell脚本
回复
ak47kkk
帖子: 21
注册时间: 2012-09-27 22:45
系统: WINDOWS 7

请教$的用法

#1

帖子 ak47kkk » 2012-10-24 22:33

大家好,我是bash shell 的新手,学习过程中遇到些问题,对于下面这句话,如何正确理解?

TOOLS_DIR=$(cd $(dirname "$0") && pwd)

dirname和pwd我知道分别是外部和内部命令,但无法理解 "$0"是什么意思,&&又是什么?

求教了!
头像
YeLee
论坛版主
帖子: 26406
注册时间: 2008-08-13 8:48
系统: Fundu i64
来自: 东海硇州,一双管钥。
联系:

Re: 请教$的用法

#2

帖子 YeLee » 2012-10-24 22:37

嗯,type一下你就知道是内置还是什么了。
$0啊,是,嗯,这个很难解释吧,程序启动参数的第一串字串啊,C语言学过吗?argv[0]就差不多了。
&&表示前面的成功就运行,不成功就跳过。
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: 请教$的用法

#3

帖子 枫叶饭团 » 2012-10-24 22:39

膜拜LS大虾,原来如果,我这么多年都白学了
ak47kkk
帖子: 21
注册时间: 2012-09-27 22:45
系统: WINDOWS 7

Re: 请教$的用法

#4

帖子 ak47kkk » 2012-10-24 22:44

YeLee 写了:嗯,type一下你就知道是内置还是什么了。
$0啊,是,嗯,这个很难解释吧,程序启动参数的第一串字串啊,C语言学过吗?argv[0]就差不多了。
&&表示前面的成功就运行,不成功就跳过。
能否将整句话的意思翻译一下?我先尝试理解下你说的。
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 请教$的用法

#5

帖子 lilydjwg » 2012-10-24 22:53

「外部和内部命令」……DOS 转过来的?builtin 叫内建命令。

实际上 pwd 和 [、echo 等一样,也有可执行文件文件版:

代码: 全选

>>> which -a pwd
pwd: shell built-in command
/usr/bin/pwd
/bin/pwd
ak47kkk
帖子: 21
注册时间: 2012-09-27 22:45
系统: WINDOWS 7

Re: 请教$的用法

#6

帖子 ak47kkk » 2012-10-24 22:54

lilydjwg 写了:「外部和内部命令」……DOS 转过来的?builtin 叫内建命令。

实际上 pwd 和 [、echo 等一样,也有可执行文件文件版:

代码: 全选

>>> which -a pwd
pwd: shell built-in command
/usr/bin/pwd
/bin/pwd
我还是比较关心整句话的意思....
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 请教$的用法

#7

帖子 lilydjwg » 2012-10-24 23:10

TOOLS_DIR=$(cd $(dirname "$0") && pwd)

变量 TOOLS_DIR 的值设置为以下命令的输出:cd $(dirname "$0") && pwd
- 进入以下命令的输出,如果成功,打印当前路径:dirname "$0"
- - 返回变量 $0 的值的路径中的目录名部分(如 xxx/abc/def -> xxx/abc)

在此例中,我也不知道为什么 dirname 可能失败……反而是 pwd 失败比较常见(但是 shell 内建的 pwd 也不会失败)。
ak47kkk
帖子: 21
注册时间: 2012-09-27 22:45
系统: WINDOWS 7

Re: 请教$的用法

#8

帖子 ak47kkk » 2012-10-25 0:02

lilydjwg 写了:TOOLS_DIR=$(cd $(dirname "$0") && pwd)

变量 TOOLS_DIR 的值设置为以下命令的输出:cd $(dirname "$0") && pwd
- 进入以下命令的输出,如果成功,打印当前路径:dirname "$0"
- - 返回变量 $0 的值的路径中的目录名部分(如 xxx/abc/def -> xxx/abc)

在此例中,我也不知道为什么 dirname 可能失败……反而是 pwd 失败比较常见(但是 shell 内建的 pwd 也不会失败)。
多谢,我开始理解了,就是先尝试cd到$(dirname "$0"),如果这条命令成功,就取pwd的值并给TOOL_DIR变量,我唯一不理解的是dirname "$0",虽然YeLee说了这是字符窜参数,但我没见过这种用法,在哪里有介绍吗?我想系统地了解下。
ak47kkk
帖子: 21
注册时间: 2012-09-27 22:45
系统: WINDOWS 7

Re: 请教$的用法

#9

帖子 ak47kkk » 2012-10-25 1:00

ak47kkk 写了:
lilydjwg 写了:TOOLS_DIR=$(cd $(dirname "$0") && pwd)

变量 TOOLS_DIR 的值设置为以下命令的输出:cd $(dirname "$0") && pwd
- 进入以下命令的输出,如果成功,打印当前路径:dirname "$0"
- - 返回变量 $0 的值的路径中的目录名部分(如 xxx/abc/def -> xxx/abc)

在此例中,我也不知道为什么 dirname 可能失败……反而是 pwd 失败比较常见(但是 shell 内建的 pwd 也不会失败)。
多谢,我开始理解了,就是先尝试cd到$(dirname "$0"),如果这条命令成功,就取pwd的值并给TOOL_DIR变量,我唯一不理解的是dirname "$0",虽然YeLee说了这是字符窜参数,但我没见过这种用法,在哪里有介绍吗?我想系统地了解下。
我搜了一下,$0是指Shell 本身的文件名,也就是bash,那么dirname "bash"就返回.,即当前目录,那这句话的意思就是获取当前目录并赋值给TOOLS_DIR??需要这么复杂吗?还是我理解有错误?
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 请教$的用法

#10

帖子 lilydjwg » 2012-10-25 10:56

ak47kkk 写了: 我搜了一下,$0是指Shell 本身的文件名,也就是bash,那么dirname "bash"就返回.,即当前目录,那这句话的意思就是获取当前目录并赋值给TOOLS_DIR??需要这么复杂吗?还是我理解有错误?
在 shell 中,$0 是脚本名(依据实现,通常是绝对路径,但也有可能是相对路径)。
ak47kkk
帖子: 21
注册时间: 2012-09-27 22:45
系统: WINDOWS 7

Re: 请教$的用法

#11

帖子 ak47kkk » 2012-10-26 9:09

lilydjwg 写了:
ak47kkk 写了: 我搜了一下,$0是指Shell 本身的文件名,也就是bash,那么dirname "bash"就返回.,即当前目录,那这句话的意思就是获取当前目录并赋值给TOOLS_DIR??需要这么复杂吗?还是我理解有错误?
在 shell 中,$0 是脚本名(依据实现,通常是绝对路径,但也有可能是相对路径)。
那简单一句话就是,这段脚本就是想获取Shell运行的脚本所在的路径,并赋值给TOOLS_DIR。
回复