是否有任何sh代码在语法上不是有效的 bash 代码(不会对语法造成障碍)?
我想重写sh与bash某些命令。
假设我们有一个像这样的 bash 脚本:
echo "x" &
echo "y" &
echo "z" &
.....
echo "Z" &
wait
Run Code Online (Sandbox Code Playgroud)
有没有办法收集子外壳/子进程的退出代码?正在寻找方法来做到这一点,但找不到任何东西。我需要并行运行这些子shell,否则会更容易。
我正在寻找一个通用的解决方案(我有一个未知/动态数量的子进程并行运行)。
一开始这有点好笑,就像玩“Bash Roulette”……但现在它变老了,哈哈
我的终端中以非零代码退出的任何命令都会关闭我的终端窗口
有人告诉我,也许我已经set -e在我的终端来源的某个地方设置了一些 bash 脚本。
我已经检查.bash_profile/ .bashrc/.profile它看起来不像set -e是在那里。
还会有其他明显的罪魁祸首吗?
假设我手头有一个pid, mypid=$$
是否有一些 bash/system 命令我可以用给定的 pid 来监听该进程的退出?
如果不存在带有 mypid 的进程,我想该命令应该只是失败。
假设我运行了一些进程:
#!/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 的每一行似乎都是原子的。这是如何运作的?什么实用程序控制每行的原子性?
假设我有一个像这样的 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 脚本:
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,时间粒度不超过秒。如果可能的话,我需要得到比这更细粒度的东西。
usingtar --list --file=x将列出所有文件和文件夹。我只是想列出顶级文件和文件夹
有谁知道这是怎么做到的吗?
或者,有没有人知道如何只列出顶级文件,但包括子文件夹在内的所有文件夹?也许以某种方式使用grep?
更新:寻找适用于包括 MacOS 在内的大多数 nix 风格的东西。
使用
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) 当我打开终端会话时,我得到了这个:
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)