小编Ric*_*mas的帖子

bash 中的 $PS4 - 如何重现 GNU 文档中提到的“间接级别”行为?

我正在阅读GNU 文档,并且我看到以下句子作为 定义的一部分PS4

\n
\n

扩展值的第一个字符根据需要被复制多次,以指示多个间接级别。默认为 \xe2\x80\x98+ \xe2\x80\x99。

\n
\n

我将此解释为我将+在代码中看到每个抽象级别的符号。我想在我的 shell 中重现这种行为,所以我编写了以下代码:

\n
#!/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调用foofoo调用baz,我预计最多有 3 级间接,因此我预计会看到类似以下(或类似)的输出:

\n
+ 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)

bash

7
推荐指数
2
解决办法
651
查看次数

-bash: lstat: 命令未找到

我正在使用运行 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以他们的名义返回以下内容:

  • 数据库状态
  • 差异统计
  • httpdstat.d
  • 统计数据
  • jstatd
  • 锁状态
  • lpstat
  • nfsstat
  • plockstat
  • smpnetstat
  • 状态
  • 状态
  • 乌斯塔特
  • vm_stat

如上所述,我的猜测是stat返回我期望返回的输出lstat。我的问题是:

  • lstatman lstat识别lstat为有效命令时,为什么显然没有安装在我的系统中?
  • 为什么要包含未随附的可执行文件的手册信息? …

command-line osx stat darwin

6
推荐指数
1
解决办法
5245
查看次数

当设置了“noclobber”选项时,“/dev/null”与其他文件的处理方式是否不同?

作为一个实验,我尝试运行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和目的),但我在这里没有看到任何有关此效果的文档。我想这可能是一个未记录的功能,或者(可能更有可能)我只是错过了文档?

bash

6
推荐指数
1
解决办法
734
查看次数

为什么 `exec -a` 没有按我预期的方式工作?

我正在阅读exec以及如何使用该-a标志。SS64 文档看起来很准确;他们说:

执行:

执行命令

句法:

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.
Run Code Online (Sandbox Code Playgroud)

为了测试这一点,我编写了两个脚本,一个名为 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

4
推荐指数
1
解决办法
1473
查看次数

Fish shell - 这个语法有什么问题?

我有一个 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)

fish

0
推荐指数
1
解决办法
838
查看次数

标签 统计

bash ×3

command-line ×1

darwin ×1

fish ×1

osx ×1

stat ×1