我一直在做几个项目,它们需要不同的环境变量(例如,PATH
对于不同版本的clang
可执行文件,PYTHONPATH
对于几个外部模块)。每当我在一个项目上工作时,我必须自己修改这些环境变量(例如,更改.zshrc
/.bashrc
和source
它);我有时会忘记并犯错。
是否有一种方法/项目可以帮助自动执行此操作,类似于virtualenv在 Python 中所做的工作?
如何限制每个用户的活动登录次数?
我以前在各种服务器上看到过这个,我想知道如何自己设置它。也许在这些情况下,这是通过限制每个用户的活动 SSH 登录次数来实现的?我想这将是要走的路。我该如何设置?
如何从 ksh 脚本中安全地获取 ksh 版本?
我已经看到以下解决方案:
ksh --version
echo ${.sh.version}
echo $KSH_VERSION
并且在适当的情况下,每一个都可以正常工作。但是,我关心不完美的情况。
具体来说,我使用的几台机器都有旧版本的 ksh,就我而言,这些机器严重缺乏功能。无论如何,我想(以编程方式)检查版本的原因是查看 ksh 版本是否是功能较弱的版本之一;如果是这样,我想用不那么棒的代码执行一个分支。
然而,在有问题的机器上,shell 的无能扩展到检查版本......
ksh --version
,它不会打印任何内容并打开ksh
!如果我尝试echo ${.sh.version}
,ksh
则将其视为不能用2> /dev/null
.
$ echo ${.sh.version} 2> /dev/null
ksh: ${.sh.version}: bad substitution
Run Code Online (Sandbox Code Playgroud)当然echo $KSH_VERSION
看起来工作正常——我的意思是它不会崩溃——尽管在这些机器上它是空白的。另外,我看到的地方是KSH_VERSION
只被设定pdksh
。
问题:
ksh
编程方式安全地检查版本?出于我的目的,我并不真正关心实际的版本号是什么,只关心它是否是ksh
.$KSH_VERSION
足够好?我的意思是如果它是空白的,那么ksh
一定是过时的版本吗?其他论坛是否正确,即使对于较新版本的ksh
.我想了解 autotools,所以我刚开始在 YouTube 上观看一些教程。
我创建了一个名为的文件夹hello
,然后创建了一个configure.ac
文件:
AC_INIT([hello],[.01])
AC_OUTPUT
Run Code Online (Sandbox Code Playgroud)
我保存了它然后跑了autoreconf -i
。显然,这在第一次不起作用,因为它没有安装。然后我autoconf
通过命令安装sudo apt-get install autoconf2.13
。
现在在此之后我再次运行autoreconf -i
,但现在我收到如下所示的错误:
Can't exec "libtoolize": No such file or directory at /usr/bin/autoreconf2.50 line 196.
Use of uninitialized value in pattern match (m//) at /usr/bin/autoreconf2.50 line 196.
Run Code Online (Sandbox Code Playgroud) 假设我有以下管道:
a | b | c | d
Run Code Online (Sandbox Code Playgroud)
我怎样才能在or 中等待c
(或b
)完成?这意味着该脚本可以开始任何时间(和它不是必须等待),但需要完整的输出正确地工作。sh
bash
d
c
用例是difftool
用于git
比较图像。它被调用git
并需要处理其输入(a | b | c
零件)并显示比较的结果(d
零件)。调用者将删除a
和所需的输入b
。这意味着在从脚本返回之前,进程c
(或b
)必须终止。另一方面,我不能等待,d
因为这意味着我正在等待用户输入。
我知道我可以将结果写入c
临时文件,或者在bash
. (不过,不确定 FIFO 是否会有所帮助。)是否可以在没有临时文件的情况下实现这一点sh
?
编辑
如果我能以可靠的方式找出c
(或b
)进程的进程 ID,也许就足够了。然后整个管道可以异步启动,我可以等待进程 ID。类似的东西
wait $(a | b | { c & [print PID of c] ; } | d)
Run Code Online (Sandbox Code Playgroud)
编辑^2 …
当我在 Fedora 中使用 say 运行安装yum groupinstall "Development Tools"
时,有时会提示我点击 y/N。
当出现此类提示时,我可以告诉操作系统自动选择“y”吗?那会让我离开我的电脑一段时间然后回来。
作为一名主要的 Java 程序员,我发现 bash if
-then
构造非常令人困惑,尤其是在空格方面。谁能解释为什么第一个有效,而第二个或第三个无效?
#works
if [ -n $1 ]; then echo "parameterized"; fi
#output: ./links: Zeile 1: [-n: Kommando nicht gefunden.
if [-n $1 ]; then echo "parameterized"; fi
#output: ./links: Zeile 1: [: Fehlende `]'
if [ -n $1]; then echo "parameterized"; fi
Run Code Online (Sandbox Code Playgroud) 我如何gcc
在 FreeBSD 上安装最新版本并设置系统,以便使用这个最新版本来编译更多程序?
在撰写本文时,最新版本gcc
是 4.9.0。我使用 FreeBSD 10.0。
我实际上需要g++
,C++ 编译器;但我需要gcc49
为它安装类似package 的东西,对吗?
很多时候,我们运行一个需要写入/读取一些临时文件的可执行文件。我们通常创建一个临时目录,在那里运行可执行文件,并在脚本完成后删除该目录。
即使可执行文件被杀死,我也想删除该目录。我试图将它包装在:
#!/bin/bash
dir=$(mktemp -d /tmp/foo.XXXXXXX) && cd $dir && rm -rf $dir
/usr/local/bin/my_binary
Run Code Online (Sandbox Code Playgroud)
当my_binary
死掉时,内核将删除该目录的最后一个进程,因为脚本是持有该目录的最后一个进程inode
;但我无法在删除的目录中创建任何文件。
#!/bin/bash
dir=$(mktemp -d /tmp/foo.XXXXXXX) && cd $dir && rm -rf $dir
touch file.txt
Run Code Online (Sandbox Code Playgroud)
产出 touch: file.txt: No such file or directory
我能想到的最好方法是在进程终止时删除临时目录,捕获最常见的信号,并使用 cron 运行清理进程:
#!/bin/bash
dir=$(mktemp -d /tmp/d.XXXXXX) && cd "$dir" || exit 99
trap 'rm -rf "$dir"' EXIT
/usr/local/bin/my_binary
Run Code Online (Sandbox Code Playgroud)
有没有一些简单的方法来创建一个真正的临时目录,无论发生什么,当当前二进制文件死亡时都会自动删除该目录?