我在 tcsh 中遇到重定向问题。
考虑以下命令:vi --version和vi --xxx。让我们假设这是在vi支持该--version选项的机器上。该选项--xxx无效,因此vim应通过stderr.
根据这个推理,2> /dev/null与这两个命令一起使用应该给出有效情况的输出,而无效情况则没有输出。
这就是我在 bash、zsh、ksh 和 dash 中看到的。
$ vi --xxx 2> /dev/null
$ vi --version 2> /dev/null
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Oct 20 2014 16:09:17)
...
Run Code Online (Sandbox Code Playgroud)
但是,当我在 tcsh 中尝试此操作时,在这两种情况下都没有输出。
$ vi --xxx 2> /dev/null
$ vi --version 2> /dev/null
(there is no output here)
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?我重定向stderr …
如何检查命令是否是 的内置命令ksh?
在tcsh你可以使用where; 在zsh和bash您可以使用type -a; 在某些现代版本中,ksh您可以使用whence -av.
我想要做的是编写一个isbuiltin在任何版本ksh(包括ksh88和任何其他“旧”版本ksh)中工作的函数,其行为如下:
0如果所有给定的命令都是内置的,则返回(成功)1(失败)并将消息打印到 stderr。我已经有这样的工作功能zsh并bash使用上述命令。
这是我的目的ksh:
isbuiltin() {
if [[ "$#" -eq 0 ]]; then
echo "Usage: isbuiltin cmd" >&2
return 1
fi
for cmd in "$@"
do
if [[ $cmd = "builtin" ]]; then
#Handle the …Run Code Online (Sandbox Code Playgroud) 我正在使用 PHP 脚本调用shell_exec并执行wget将一些文件下载到/var/www/dir/. (内部工具,因此安全性不是什么大问题)
该目录具有777权限。但是当我运行时wget,所有文件都是644默认的。理想情况下,我希望665对 group 进行组写访问www-data。
如何设置wget下载文件的权限?我不想chmod -R在每次通话后都跑。
如何检查 tcsh 中的字符串是否为空?
在你吓坏之前,不,我不是在用 tcsh 编写 shell 脚本。我问是因为我想在我的 .tcshrc 文件中使用它。
具体来说,我想在 tcsh 中做这个 bash 代码的等价物:
if [[ -z $myVar ]]; then
echo "the string is blank"
fi
Run Code Online (Sandbox Code Playgroud) 我偶尔做旧的Solaris机器其默认的版本上工作grep的非POSIX兼容的。这会导致我的 rc 文件出现问题,因为grep机器上的默认设置不支持我需要的选项。
这是我工作地点的一台机器,我不是管理员;所以我不能只安装我认为合适的更新/更好版本的命令。但是,我注意到该机器确实有合适的XPG版本grepat /usr/xpg4/bin/grep。
显然,我可以在我的 rc 文件中解决这个问题(对于 Solaris):
alias grep='/usr/xpg4/bin/grep'
Run Code Online (Sandbox Code Playgroud)
但是那些不需要的机器呢?我的目标是为每个 shell 拥有一个单独的 rc 文件,我可以将其放入任何类 Unix 系统并使其正常工作。
这让我想到...
/usr/xpg4/bin/的开头添加$PATH并放弃将单个命令别名到它们的 XPG* 版本吗?
/usr/xpg4/bin/只存在于“必要”的机器上?
/usr/xpg4/bin/我的 Ubuntu 机器上不存在。总而言之,这是一个好主意吗?
if [ -d "/usr/xpg4/bin" ]; then
#Place XPG directory at beginning of path to always use XPG version of commands
export PATH="/usr/xpg4/bin:$PATH"
fi
Run Code Online (Sandbox Code Playgroud)
如果没有,为什么不呢?
如何循环遍历 shell 脚本中的所有用户?
我正在编写一个 shell 脚本来在系统上执行清理。如果脚本以 root 身份运行,我想在所有用户的主目录中执行请求的操作。
我想我可以遍历/etc/passwd; 中的行。然而,我看到的条目比活着的、呼吸的用户多得多。有什么特殊的方法可以清除虚拟用户/etc/passwd吗?
我更喜欢为 Bourne Shell 量身定制的解决方案(为了便携性)。也欢迎伪代码和纯粹的解释。
uname -n和 和有hostname什么区别?他们返回的内容有什么真正的区别吗?不同操作系统的可用性是否存在差异?其中一个是否包含在 POSIX 中,另一个没有?
在 Gentoo Linux 机器上,一个进程通过串行端口 ( /dev/ttyS1)与另一台计算机通信。我想在不进一步干扰的情况下收听此通信(即进程发送/接收的内容)。
如何仅使用基本的 Linux 工具来实现这一目标?我什至可以更改进程正在与之通信的串行端口,所以也许我可以“快捷地”两个设备(/dev/ttyS1和/dev/xxx)侦听所有通信,当所有输出/dev/ttyS1都转发到时/dev/xxx,反之亦然。但是我该怎么做呢?有什么socat?
我在树莓派上运行 Arch-Linux ARM。
我的项目目标是将条形码扫描仪连接到 Pi,将扫描的消息转发到 LAN 中的服务器。
为了加强系统以防止断电等并最大限度地减少所需的用户交互,我希望对其进行设置,以便某个用户在启动时自动登录(完成并工作),并且在启动时运行特定程序(完成并运行)有效但不符合预期)。
到目前为止,我已经通过添加
exec mono scannerSoftware.exe 127.0.0.1 1234 randomString
Run Code Online (Sandbox Code Playgroud)
以/home/certainUser/.bash_profile这样会将它甚至当我在来回切换到root(对比的.bashrc)只执行一次。
我遇到的特殊问题:当我启动系统时,它按预期工作(以某个用户身份登录,启动扫描仪软件.exe);但是如果我想切换用户并点击Ctrl+ C,它会重新启动登录过程,再次登录某些用户并再次运行程序 => 回到我来自的地方。
我对为什么会发生这种情况的猜测是系统检测到“登录未完成,最好重新启动”。
我可以通过滥发规避这一Ctrl+C周围的登录权限,让我几乎打断了它。当然,这不是好的做法。可以说它根本不实用。
我的问题:
我如何设置它以便在登录完成后执行程序,以便Ctrl+ C'ing out 将我带到一个正常的 bash 提示,而不是开始无休止的登录周期?
编辑:
我没有使用任何图形界面等,只有命令行(tty 上的 bash),因为完成后系统甚至不会有显示。
如何在命令行中为 google-chrome 添加可信证书?
对于 Firefox,我可以使用certutil二进制。
对于 google-chrome,需要哪个二进制文件或哪些步骤?
posix ×2
shell-script ×2
tcsh ×2
accounts ×1
arch-linux ×1
bash ×1
certificates ×1
chrome ×1
command ×1
function ×1
hostname ×1
ksh ×1
path ×1
permissions ×1
php ×1
profile ×1
raspberry-pi ×1
scripting ×1
serial-port ×1
stderr ×1
users ×1
wget ×1