为什么LIMIT = \`ulimit -u \`在bash中工作?

lol*_*ola 0 bash

在我的程序中,我需要知道我可以运行的最大进程数.所以我写了一个脚本.当我在shell中运行它但在程序使用时它可以工作system("./limit.sh").我在bash工作.这是我的代码:

#/bin/bash 
LIMIT=\`ulimit -u\` 

ACTIVE=\`ps -u | wc -l \`

echo $LIMIT > limit.txt

echo $ACTIVE >> limit.txt
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

Cha*_*ffy 5

原因失败的原因

如果转义,命令替换语法不起作用.当你运行:

LIMIT=\`ulimit -u\`
Run Code Online (Sandbox Code Playgroud)

...你正在做的是运行一个名为的命令

-u`
Run Code Online (Sandbox Code Playgroud)

...使用名为LIMIT的环境变量包含值

`ulimit
Run Code Online (Sandbox Code Playgroud)

...除非你实际上一个-u以其名称开头并在其名称中包含反引号的命令,否则这可能会失败.

这是因为使用反引号会使字符本身成为文字,然后运行一个var=value前面有一对或多对的命令,将这些对视为变量,以便在该单个命令的持续时间内在环境中导出.


做得更好

#!/bin/bash
limit=$(ulimit -u)
active=$(ps -u | wc -l)
printf '%s\n' "$limit" "$active" >limit.txt
Run Code Online (Sandbox Code Playgroud)
  • 放下反叛.
  • 使用现代$()命令替换语法.
  • 避免多次重定向.
  • 避免使用自己的变量的全大写名称(这些名称用于对操作系统或系统有意义的变量; 小写名称保留供应用程序使用).

做得对

#!/bin/bash
exec >limit.txt   # open limit.txt as output for the rest of the script
ulimit -u         # run ulimit -u, inheriting that FD for output
ps -u | wc -l     # run your pipeline, likewise with output to the existing FD
Run Code Online (Sandbox Code Playgroud)