小编Ale*_*lls的帖子

是否有任何 sh 代码在语法上不是有效的 bash 代码?

是否有任何sh代码在语法上不是有效的 bash 代码(不会对语法造成障碍)?

我想重写shbash某些命令。

bash shell-script posix

31
推荐指数
2
解决办法
2891
查看次数

收集并行后台进程(子shell)的退出代码

假设我们有一个像这样的 bash 脚本:

echo "x" &
echo "y" &
echo "z" &
.....
echo "Z" &
wait
Run Code Online (Sandbox Code Playgroud)

有没有办法收集子外壳/子进程的退出代码?正在寻找方法来做到这一点,但找不到任何东西。我需要并行运行这些子shell,否则会更容易。

我正在寻找一个通用的解决方案(我有一个未知/动态数量的子进程并行运行)。

shell bash shell-script subshell

29
推荐指数
5
解决办法
3万
查看次数

我的终端中以非零代码退出的任何命令都会关闭我的终端窗口

一开始这有点好笑,就像玩“Bash Roulette”……但现在它变老了,哈哈

我的终端中以非零代码退出的任何命令都会关闭我的终端窗口

有人告诉我,也许我已经set -e在我的终端来源的某个地方设置了一些 bash 脚本。

我已经检查.bash_profile/ .bashrc/.profile它看起来不像set -e是在那里。

还会有其他明显的罪魁祸首吗?

bash terminal shell-script bashrc

23
推荐指数
2
解决办法
1799
查看次数

监听给定 pid $$ 的进程退出

假设我手头有一个pid, mypid=$$

是否有一些 bash/system 命令我可以用给定的 pid 来监听该进程的退出?

如果不存在带有 mypid 的进程,我想该命令应该只是失败。

bash process shell-script proc

19
推荐指数
3
解决办法
2万
查看次数

什么阻止 stdout/stderr 交错?

假设我运行了一些进程:

#!/usr/bin/env bash

foo &
bar &
baz &

wait;
Run Code Online (Sandbox Code Playgroud)

我像这样运行上面的脚本:

foobarbaz | cat
Run Code Online (Sandbox Code Playgroud)

据我所知,当任何进程写入 stdout/stderr 时,它们的输出永远不会交错——stdio 的每一行似乎都是原子的。这是如何运作的?什么实用程序控制每行的原子性?

osx shell stdout output stderr

18
推荐指数
1
解决办法
2937
查看次数

bash 函数中的隐式返回?

假设我有一个像这样的 bash 函数:

gmx(){
  echo "foo";
}
Run Code Online (Sandbox Code Playgroud)

这个函数会隐式返回echo命令的退出值,还是需要使用返回值?

gmx(){
  echo "foo";
  return $?
}
Run Code Online (Sandbox Code Playgroud)

我假设 bash 的工作方式,bash 函数的最终命令的退出状态是“返回”的状态,但不是 100% 确定。

bash shell-script bash-functions

17
推荐指数
2
解决办法
1万
查看次数

比较两个文件修改日期

我正在创建一个通用的编译/转译系统。了解文件是否已经编译/转译的一种方法是比较源文件和目标文件的修改日期。

我需要编写一个可以做到这一点的 bash 脚本:

source_file=foo;
target_file=bar;

stat_source=$(stat source_file);
stat_target=$(stat target_file);
Run Code Online (Sandbox Code Playgroud)

但是如何从统计输出中提取日期并进行比较?有没有比stat比较文件的最近修改时间更好的方法?

如果我在日志文件上调用 stat ,我会得到:

16777220 12391188 -rw-r--r-- 1 alexamil staff 0 321 "Jun 22 17:45:53 2017" "Jun 22 17:20:51 2017" "Jun 22 17:20:51 2017" "Jun 22 15:40:19 2017" 4096 8 0 test.log
Run Code Online (Sandbox Code Playgroud)

AFAICT,时间粒度不超过秒。如果可能的话,我需要得到比这更细粒度的东西。

stat timestamps files

14
推荐指数
2
解决办法
3万
查看次数

tar --仅列出顶级文件和文件夹

usingtar --list --file=x将列出所有文件和文件夹。我只是想列出顶级文件和文件夹

有谁知道这是怎么做到的吗?

或者,有没有人知道如何只列出顶级文件,但包括子文件夹在内的所有文件夹?也许以某种方式使用grep?

更新:寻找适用于包括 MacOS 在内的大多数 nix 风格的东西。

osx grep tar

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

记录命令退出码,类似于time命令

使用

time sleep 1
Run Code Online (Sandbox Code Playgroud)

产量:

$ time sleep 1

real    0m1.005s
user    0m0.001s
sys     0m0.001s
Run Code Online (Sandbox Code Playgroud)

有没有我可以用来打印退出代码sleep或我想运行的任何命令的命令?

喜欢的东西:

$ log-exit-code sleep 1
Run Code Online (Sandbox Code Playgroud)

也许这足够了?

sleep 1 && echo "$?"
Run Code Online (Sandbox Code Playgroud)

exit exit-status

11
推荐指数
4
解决办法
4237
查看次数

为什么 sh(不是 bash)抱怨我的 .bashrc 中定义的函数?

当我打开终端会话时,我得到了这个:

sh:为“read.json”导入函数定义时出错

sh:为“ts-project”导入函数定义时出错

sh 不喜欢这些函数,因为它们看起来像:

read.json(){
   ::
}
Run Code Online (Sandbox Code Playgroud)

ts-project(){
   ::
}
Run Code Online (Sandbox Code Playgroud)

真正的问题是 - 为什么要sh触摸/解释这些文件?我在 MacOS 上看到过这个,这真是个谜。我认为只有 bash 会加载这些文件。

更新: bash 和 sh 没什么特别的。当我在终端中输入 bash 时,我得到了这个:

alex$ bash
beginning to load .bashrc
finished loading .bashrc
bash-3.2$ 
Run Code Online (Sandbox Code Playgroud)

当我sh在终端中输入时,我得到以下信息:

alex$ sh
sh: error importing function definition for `read.json'
sh: error importing function definition for `ts-project'
sh-3.2$ 
Run Code Online (Sandbox Code Playgroud)

shell bash bash-functions

11
推荐指数
2
解决办法
1793
查看次数