我正在阅读GNU 文档,并且我看到以下句子作为 定义的一部分PS4
:
\n\n扩展值的第一个字符根据需要被复制多次,以指示多个间接级别。默认为 \xe2\x80\x98+ \xe2\x80\x99。
\n
我将此解释为我将+
在代码中看到每个抽象级别的符号。我想在我的 shell 中重现这种行为,所以我编写了以下代码:
#!/usr/bin/env bash\n\nfunction baz() {\n echo "inside baz"\n}\n\nfunction foo() {\n echo "inside foo";\n baz;\n}\n\nfunction bar() {\n echo "inside bar";\n foo;\n}\n\nset -x;\n\nbar;\n
Run Code Online (Sandbox Code Playgroud)\n由于bar
调用foo
和foo
调用baz
,我预计最多有 3 级间接,因此我预计会看到类似以下(或类似)的输出:
+ bar\n+ echo \'inside bar\'\ninside bar\n++ foo\n++ echo \'inside foo\'\ninside foo\n+++ baz\n+++ echo \'inside baz\'\ninside baz\n
Run Code Online (Sandbox Code Playgroud)\n然而,我所看到的并非如此。相反,我看到:
\n+ bar\n+ echo \'inside bar\'\ninside bar\n+ foo\n+ echo …
Run Code Online (Sandbox Code Playgroud) 我正在使用运行 El Capitan v 10.11.6 的 Macbook Pro。我正在学习符号链接,在man ln
页面中,我发现了以下内容:
符号链接上的 stat(2) 将返回链接到的文件;必须执行 lstat(2) 以获取有关链接的信息。
作为测试,我创建了一个文件的符号链接(在另一个文件系统中,如果重要的话),如下所示:
ln -s /Volumes/foobardir/foobarfile foobarlink
然后我跑去lstat foobarlink
获取符号链接文件本身的信息,但我得到了以下输出:
-bash: lstat: command not found
该命令不which lstat
返回任何内容,这确认在我的文件路径中没有具有此名称的可执行文件。
我能够执行stat foobarlink
,但我不确定返回的统计数据是针对链接文件还是符号链接本身。我确实在该命令的输出中以时间戳形式看到今天的日期,而运行stat foobarfile
显示的是几个月前的日期。所以我猜这是我正在寻找的输出,但我想要第二种意见。
顺便说一句,运行which stat
返回/usr/bin/stat
。一个grep
在/usr/bin
与所有的可执行文件的目录stat
以他们的名义返回以下内容:
如上所述,我的猜测是stat
返回我期望返回的输出lstat
。我的问题是:
lstat
当man lstat
识别lstat
为有效命令时,为什么显然没有安装在我的系统中?作为一个实验,我尝试运行set -o noclobber
然后运行echo foo > /dev/null
. 我能够做到这一点;没有出现错误:
bash-3.2$ set -o noclobber
bash-3.2$ echo "foo" > /dev/null
bash-3.2$ echo "bar" > /dev/null
bash-3.2$ echo "baz" > /dev/null
Run Code Online (Sandbox Code Playgroud)
但是,当我对之前创建的文件尝试相同的操作时,我看到了预期的错误:
bash-3.2$ touch bar.txt
bash-3.2$ echo "bar" > bar.txt
bash: bar.txt: cannot overwrite existing file
Run Code Online (Sandbox Code Playgroud)
noclobber
该文件的处理方式与其他文件的处理方式是否/dev/null
不同?
注意:我理解为什么它可能会这样做(即因为它的性质/dev/null
和目的),但我在这里没有看到任何有关此效果的文档。我想这可能是一个未记录的功能,或者(可能更有可能)我只是错过了文档?
我正在阅读exec
以及如何使用该-a
标志。SS64 文档看起来很准确;他们说:
执行:
执行命令
句法:
Run Code Online (Sandbox Code Playgroud)exec [-cl] [-a name] [command [arguments]]
选项:
Run Code Online (Sandbox Code Playgroud)-c Causes command to be executed with an empty environment. -l Place a dash at the beginning of the zeroth arg passed to command. (This is what the login program does.) -a The shell passes name as the zeroth argument to command.
为了测试这一点,我编写了两个脚本,一个名为 name foo/baz
,一个名为 name foo/buzz
:
#!/usr/bin/env bash
# foo/baz
exec -a blah ./foo/bar 1 2
Run Code Online (Sandbox Code Playgroud)
#!/usr/bin/env bash
# …
Run Code Online (Sandbox Code Playgroud) 我有一个 bash 脚本,其中cat
包含heredoc字符串,我在 Fish shell 中运行它,然后将其通过管道传递给调用source
,如下所示:
〜/ foo /巴兹:
1 #!/usr/bin/env bash
2
3 cat << EOS
4 function bar
5 echo 'Hello world'
6 end
7 EOS
Run Code Online (Sandbox Code Playgroud)
从鱼壳上看:
richiethomas@richie ~/foo (master) [126]> ./baz | source
richiethomas@richie ~/foo (master)> bar
Hello world
Run Code Online (Sandbox Code Playgroud)
如上所示,这会导致bar
我运行时可以调用该函数./baz | source
。
但是,当我将函数的实现更改bar
为以下内容时,出现错误:
1 #!/usr/bin/env bash
2
3 cat << EOS
4 function bar
5 set myVar 5
6 switch $myVar
7 case 4
8 echo '4' …
Run Code Online (Sandbox Code Playgroud)