相关疑难解决方法(0)

检查程序是否存在

在我的 perl 脚本中,我想执行 bash 命令。该脚本需要很长时间,因此在脚本的开头我想查看该命令是否存在。这个答案说尝试运行它,另一个答案建议使用一些 bash 命令来测试该程序是否存在。

后一个选项是最佳解决方案吗?有没有更好的方法在 perl 中进行此检查?

linux bash perl

6
推荐指数
1
解决办法
2917
查看次数

Oh-my-ZSH 插件无法访问外部应用程序时如何隐藏终端警告

我使用 oh-my-zsh 一段时间了,效果很好。我想使用命令行模糊查找器插件,因此我在 .zshrc 中启用了它:

plugins=(fzf)
Run Code Online (Sandbox Code Playgroud)

但是,如果未安装“fzf”,我在打开终端窗口时会收到警告:

[oh-my-zsh] fzf 插件:找不到 fzf 安装目录。请添加export FZF_BASE=/path/to/fzf/install/dir到您的 .zshrc

有没有办法隐藏该警告消息?当我使用“sudo dnf install fzf”安装 fzf 时,警告消失,但也许我想将我的点文件克隆到另一台计算机上,该计算机不可用,而且在那里并不那么重要。

zsh fzf

6
推荐指数
1
解决办法
4211
查看次数

由 Bash 执行与由 cron 执行时,脚本会产生不同的结果

请考虑以下 crontab (root):

SHELL=/bin/bash
...
...
0 */3 * * * /var/maintenance/raid.sh
Run Code Online (Sandbox Code Playgroud)

和 bash 脚本/var/maintenance/raid.sh

#!/bin/bash

echo -n "Checking /dev/md0... "
if ! [ $(mdadm --detail /dev/md0 | grep -c "active sync") -eq 2 ]; then
    mdadm --detail /dev/md0 | mail -s "Raid problem /dev/md0" "my@email.com";
    echo "ERROR"
else 
    echo "ALL OK"
fi;

#-------------------------------------------------------

echo -n "Checking /dev/md1... "
...
Run Code Online (Sandbox Code Playgroud)

这就是当...

...从 shell 提示符 (bash) 执行:

带有mdadm --detail /dev/md0输出的邮件被发送到我的电子邮件(正确的行为)

...由 cron 执行:

空白邮件发送到我的邮箱(主题在那里,但没有消息)


为什么会有这种差异以及如何解决?

linux bash shell cron

5
推荐指数
1
解决办法
2115
查看次数

以root身份运行python脚本

我有以下脚本:

#!/usr/bin/env python                                                           

import sys                                                                      
import pyttsx                                                                   

def main():                                                                     
        print 'running speech-text.py...'                                       
        engine = pyttsx.init()                                                  
        str = "Hi..."                                    
        if len(sys.argv) > 1:                                                   
                str = sys.argv[1]                                               
        engine.say(str)                                                         
        engine.runAndWait()                                                     

if __name__ == '__main__':                                                      
        main() 
Run Code Online (Sandbox Code Playgroud)

而且我把它放进去了 /usr/bin/speech-test.py

我还给root了它的可执行权限和所有权:

sudo chown root:root /usr/bin/speech-test.py
sudo chmod 4755 /usr/bin/speech-test.py
Run Code Online (Sandbox Code Playgroud)

但是,如果我运行,此脚本将只能正确运行sudo speec-test.py.如果我试图运行它只是speech-test.py它抱怨没有找到一堆ALSA lib文件.

我错过了让我的脚本以root权限运行的东西吗?

python shell alsa root

5
推荐指数
1
解决办法
4万
查看次数

未找到命令时的安全 shell 重定向

假设text当前目录中有一个名为(不管它包含什么内容)的文本文件,当我运行命令时(在 Ubuntu 14.04,bash 版本 4.3.11 中):

nocommand > text # make sure noommand doesn't exists in your system
Run Code Online (Sandbox Code Playgroud)

它报告“找不到命令”错误并删除文本文件!我只是想知道如果命令不存在我是否可以避免文件的破坏。我尝试这个命令set -o noclobber,但如果我运行以下命令,也会出现同样的问题:

nocommand >| text # make sure noommand doesn't exists in your system
Run Code Online (Sandbox Code Playgroud)

bash 似乎在寻找要运行的特定命令之前重定向输出。谁能给我一些如何避免这种情况的建议?

bash shell

5
推荐指数
2
解决办法
778
查看次数

通过 exit 停止预提交钩子中的 git commit

我试图阻止 git 提交继续使用预提交挂钩。通过阅读手册,当您返回 0 以外的退出代码时,它应该停止。我正在测试 csscomb 命令是否返回错误,如果返回错误,则中断循环并退出,但 git 提交仍然继续通过 来输入消息git commit (-a)

我已经从https://github.com/filtercake/git-pre-commit-csscomb分叉并修改了下面的脚本

#!/bin/bash

# pre-commit hook to comb staged .sass and .scss files
# save as .git/hooks/pre-commit
# make executable: chmod +x .git/hooks/pre-commit

# sources:

# http://www.hagenburger.net/BLOG/Using-Git-Commit-Hooks-to-Autocompile-Sass-to-CSS.html
# http://stackoverflow.com/questions/8470755/git-pre-commit-hook-add-file-into-index/8471009#8471009
# http://stackoverflow.com/questions/592620/how-to-check-if-a-program-exists-from-a-bash-script/677212#677212
# https://gist.github.com/openam/8406343

# check if sass/scss files are staged for commit

# diff-lines from http://stackoverflow.com/a/12179492/3019532
# takes the line
function diff-lines() {
    local path=
    local line=
    while read; do
        esc=$'\033'
        if [[ $REPLY =~ ---\ …
Run Code Online (Sandbox Code Playgroud)

git macos bash pre-commit-hook githooks

5
推荐指数
1
解决办法
4905
查看次数

如何检查Unix shell脚本中是否安装了Docker?

我需要检入Shell脚本(如果已安装Docker)(Ubuntu服务器)。

我想出了这一点,但语法不正确。

if [[ which docker && docker --version ]]; then
  echo "Update docker"
  # command
else
  echo "Install docker"
  # command
fi
Run Code Online (Sandbox Code Playgroud)

我也试过 if [ which docker ] && [ docker --version ]; then

shell ubuntu docker

5
推荐指数
2
解决办法
8207
查看次数

4
推荐指数
3
解决办法
6307
查看次数

检查是否存在wget/curl

尝试使用wget下载文件的脚本,或者如果Linux中不存在wget则使用curl.如何让脚本检查是否存在wget?

linux shell

4
推荐指数
3
解决办法
1万
查看次数

Bash,...使用bash脚本检查是否安装了程序

我正在尝试创建一个小脚本来检查程序是否已安装.我正在尝试使用tmux,......

`tmux --help` | grep "tmux: command not found" &> /dev/null
if [ $? == 1 ]; then
    echo "tmux is not installed"
    exit
fi
Run Code Online (Sandbox Code Playgroud)

安装完tmux后,我得到:

usage: tmux [-2lquvV] [-c shell-command] [-f file] [-L socket-name]
            [-S socket-path] [command [flags]]
tmux is not installed
Run Code Online (Sandbox Code Playgroud)

如果没有安装程序,请使用字符串"tmux:command not found".这可以解释为什么我grep输出tmux --help命令.是否是检查tmux是否安装的正确方法?

脚本alwais回声"未安装tmux".即使我安装了tmux.它出什么问题了?

bash

4
推荐指数
1
解决办法
8974
查看次数

标签 统计

bash ×5

shell ×5

linux ×4

perl ×2

alsa ×1

cron ×1

docker ×1

fzf ×1

git ×1

githooks ×1

macos ×1

pre-commit-hook ×1

python ×1

root ×1

ubuntu ×1

zsh ×1