小编Nat*_*ong的帖子

shell 变量可以有哪些作用域?

我刚遇到一个问题,显示我不清楚 shell 变量的范围。

我试图使用bundle install,这是一个 Ruby 命令,它使用 的值$GEM_HOME来完成其工作。我已经设置了$GEM_HOME,但是在我使用之前,该命令忽略了该值export,如export GEM_HOME=/some/path.

我读到这使变量以某种方式“全局”(也称为环境变量),但我不明白这意味着什么。我了解编程中的全局变量,但不了解不同的程序。

此外,鉴于我设置的此类变量仅适用于当前的 shell 会话,我将如何为守护进程设置它们?

shell 变量可以有哪些作用域?

environment-variables

44
推荐指数
3
解决办法
6万
查看次数

为什么将文件“cat”到自身中会擦除它?

可能重复:
IO 重定向和 head 命令

我只想删除文件的第一行以外的所有内容。我这样做了:

head -1 foo.txt
Run Code Online (Sandbox Code Playgroud)

...并确认我只看到了第一行。然后我做了:

head -1 foo.txt > foo.txt
Run Code Online (Sandbox Code Playgroud)

但不是只包含第一行,foo.txt现在是空的。

事实证明,这cat foo.txt > foo.txt也清空了文件。

为什么?

cat head stdout

12
推荐指数
1
解决办法
8646
查看次数

从 Vim 退出时如何使 shell 别名可用?

在 my 中.zshrc,我声明了一些别名。例如,which dbstart显示该别名的内容。

如果我从那个 shell 打开 vim,它就是一个子进程。在 Vim 中,我可以使用:! some_command. 如果我:! echo $0要查看 Vim 正在使用什么 shell,它会输出“/bin/zsh”。但是,我的别名在那里不可用。

当我从 Vim 退出时,如何使我的普通 shell 别名可用?

两个想法:

  • 不知何故EXPORT,别名从原始 shell 到它的子进程vim,再到它的 shell 子进程
  • 配置 Vim.zshrc在创建其子 shell 时读取 my

shell vim alias environment-variables

12
推荐指数
2
解决办法
5198
查看次数

在 $PWD 发生任何更改后,如何在 bash 中运行命令?

zsh 提供了一些不错的钩子函数,包括chpwd在用户更改目录后运行函数。

# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd  # hi
Run Code Online (Sandbox Code Playgroud)

我正在尝试在 bash 中模拟它。

约束:

  • 它必须在交互式和非交互式 shell 中都可以工作,我认为这意味着它不能依赖于类似的东西 $PROMPT_COMMAND
  • 它不能重新定义cd,因为我希望它适用于任何更改目录的命令(例如,pushdpopd
  • 它必须用户的命令之后运行,所以trap "my_function" DEBUG不起作用,除非我能以某种方式在那里说,“首先运行$BASH_COMMAND我们被困,然后也这样做......”我看到我可以避免启用$BASH_COMMAND if 的自动运行并且trap 函数返回 1,但我认为我不想强制,并且返回成功(但已修改)的命令似乎是错误的。extdebugextdebug1

最后一部分——“按照用户的命令运行”——是目前让我感到困惑的部分。如果我可以在每个命令之后运行一个函数,我可以让它检查自上次检查以来目录是否已更改。例如:

function check_pwd() {
  # true in a new shell (empty var) or after cd
  if …
Run Code Online (Sandbox Code Playgroud)

bash hook pwd

12
推荐指数
1
解决办法
1675
查看次数

如何根据连续两行的内容 grep 目录?

如何 grep包含“Foo”的行的目录,但在下一行还包含“Bar”时才获得匹配项?

grep regular-expression

11
推荐指数
3
解决办法
2129
查看次数

其他过程如何影响使用“时间”进行的测量?

如果我使用time命令对进程计时,我会得到“real”、“user”和“sys”的输出。

我从这次讨论中的理解是“真实”是墙壁时间,而“用户”和“系统”是进程时间。

这是否意味着“用户”和“系统”将不受其他进程的影响?换句话说,如果计算机处于其他进程的重负载或轻负载下,则可能需要更多的时间在挂钟上(“真实”)来完成我的进程。但是我的过程可能只需要 5 秒的运行时间,即使它分散了超过 20 秒的实际时间。

无论系统在做什么,我能保证我会被告知“5 秒用户时间”吗?

performance time benchmark

7
推荐指数
1
解决办法
741
查看次数

为什么没有使用 $PATH 中的第一个可执行文件?

我有一个调用的脚本jsl/usr/local/bin。运行which jsl在那里找到它。

我想暂时使用一个不同的版本,当echo $PATH我看到它/usr/bin在路径的早期。所以我添加了一个jsl在该文件夹中调用的脚本,并且我已经验证它是可执行的并且在使用完整路径调用时可以正确运行。

但是,which jsl仍然找到第一个版本,并且jsl仍然运行它。

为什么我的新人jsl没有which被姓名发现或被处决?

path

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

是否有像 && 这样的运算符忽略返回状态?

我在命令行上发现了以下用于长时间运行任务的有用技巧:

do_some_task && make_a_noise
Run Code Online (Sandbox Code Playgroud)

例如,在 OSX 上:

do_some_task && say 'done'
Run Code Online (Sandbox Code Playgroud)

但是,&&表示“如果前一个命令成功返回 0,则运行下一个命令”。如果第一个命令失败,则第二个命令不会执行。

是否有类似的运算符表示“无论上一个命令的返回状态如何都执行此操作”?

command-line

5
推荐指数
1
解决办法
577
查看次数