我有一个运行脚本的 cron 作业。当我通过交互式 shell(ssh 到 bash)运行脚本时,它工作正常。当脚本通过 cron 自行运行时,它会失败。
我的猜测是它使用了交互式 shell 中设置的一些环境变量。我将对脚本进行故障排除并删除它们。
进行更改后,我知道我可以在 cron 中将脚本排队以使其正常运行,但是有没有一种方法可以从命令行运行脚本,但告诉它像从 cron 一样运行 -即在非交互式环境中?
升级到 Python 3.4 后,所有交互式命令都记录到~/.python_history. 我不希望 Python 创建或写入此文件。
创建符号链接/dev/null不起作用,Python 删除文件并重新创建它。该文件建议删除sys.__interactivehook__,而且,这还将删除制表完成。应该怎么做才能禁用写入此历史文件但仍保留制表符完成功能?
额外细节:
我想在一大组文件中搜索和替换一些文本,不包括某些实例。对于每一行,我想要一个提示,询问我是否需要替换该行。类似于 vim 的:%s/from/to/gc(带有cto 提示进行确认),但跨一组文件夹。是否有一些好的命令行工具或脚本可以使用?
我想编写一个与用户交互的脚本,即使它位于管道链的中间。
具体来说,它需要一个fileor stdin,显示行(带有行号),要求用户输入一个选择或行号,然后将相应的行打印到stdout。让我们调用这个脚本selector。那么基本上,我希望能够做到
grep abc foo | selector > myfile.tmp
Run Code Online (Sandbox Code Playgroud)
如果foo包含
blabcbla
foo abc bar
quux
xyzzy abc
Run Code Online (Sandbox Code Playgroud)
然后selector向我展示(在终端上,而不是在myfile.tmp!)
1) blabcbla
2) foo abc bar
3) xyzzy abc
Select options:
Run Code Online (Sandbox Code Playgroud)
之后我输入
2-3
Run Code Online (Sandbox Code Playgroud)
并以
foo abc bar
xyzzy abc
Run Code Online (Sandbox Code Playgroud)
作为 的内容myfile.tmp。
我已经启动并运行了一个选择器脚本,如果我不重定向输入和输出,它基本上可以完美运行。所以
selector foo
Run Code Online (Sandbox Code Playgroud)
表现得像我想要的。但是,当如上例那样将事物组合在一起时,selector将显示的选项打印到myfile.tmp并尝试从 grepped 输入中读取选择。
我尝试使用 的-u标志read,如
exec 4< /proc/$PPID/fd/0
exec 4> /proc/$PPID/fd/1 …Run Code Online (Sandbox Code Playgroud) 我在 my 中定义了许多函数.bashrc,旨在在终端中交互使用。我通常在它们之前添加一条描述其预期用途的评论:
# Usage: foo [bar]
# Foo's a bar into a baz
foo() {
...
}
Run Code Online (Sandbox Code Playgroud)
如果浏览源代码,这很好,但是type在终端中运行以快速提醒该函数的作用是很好的。然而,这(可以理解)不包括评论:
$ type foo
foo is a function
foo ()
{
...
}
Run Code Online (Sandbox Code Playgroud)
这让我想到“如果这种评论持续存在以便type可以显示它们,那不是很好吗?” 本着 Python文档字符串的精神,我想出了这个:
foo() {
: Usage: foo [bar]
: "Foo's a bar into a baz"
...
}
$ type foo
foo is a function
foo ()
{
: Usage: foo [bar];
: "Foo's a bar into a baz";
...
} …Run Code Online (Sandbox Code Playgroud) 我正在调查通常作为自动化进程(例如 cron、Jenkins)运行的脚本的行为。脚本可以(最终)调用以交互方式运行时行为不同(寻求用户输入)的命令;例如,patch会询问如何处理反向补丁,并svn询问密码,但我需要看看当它们以非交互方式运行时会发生什么。
说服patch它是非交互式的相当容易;我只需要重定向stdout为非 tty:
$ </dev/null > >(cat) /path/to/myscript --args
Run Code Online (Sandbox Code Playgroud)
但是svn,如果存在,将连接到控制终端;编辑要通过的脚本--non-interactive并不是一个真正的选择,因为这来自多个层次,很难确定我是否找到了每个调用。
有没有办法在没有控制终端的情况下以非交互方式调用脚本/命令(所以/dev/tty不存在)?我更喜欢 stdout/stderr 仍然去我的终端。
(我发现了在非交互式 shell 中运行脚本的问题?但该问题的答案讨论了 cron 和用户环境之间的差异;我已经消除了除非交互性之外的所有差异。)
我想创建一个在 Zsh 实例启动时运行的脚本,但前提是该实例是:
我觉得我说得对.zshrc运行的所有交互shell实例,.zprofile并.zlogin为所有登录shell运行,并且.zshenv运行于所有情况。
我想这样做的原因是检查是否有现有的 ssh-agent 正在运行,如果有,请在新打开的 shell 中使用它。
我想任何执行的测试都最好放在.zshrc(因为这保证了交互式 shell)和从那里调用的指定“非登录事件”脚本中。
在测试 ssh-agent 之前,我可能首先想检查新 shell 是否已经作为现有远程 SSH 会话的一部分运行,但我为此找到了这个 SE 配方。
我选择 Zsh 是因为它是我喜欢的 shell,但我想任何正确的技术都适用于其他 shell。
如果我使用rm -rfi,每次删除每个文件时都会询问我。如果我有一个命令列表rm -rf,我怎样才能使机器只要求我确认一次(当尝试删除目录本身时)
使用 BashCtrlL将清除屏幕但不回滚缓冲区。过去,我通过使用以下方法解决了这个问题:
tput reset
Run Code Online (Sandbox Code Playgroud)
但是我注意到这个命令不会用 Zsh 清除回滚缓冲区。那么,它是如何完成的呢?
我经常直接想要一个临时文件,我可以在其中解压缩一些存档(或创建一个临时项目),查看一些文件。预先无法预测特定目录可能需要多长时间。
此类目录通常是杂乱的主目录/tmp、项目目录。他们通常有一些弱密码之类的名字,比如qqq, 1,test在一个月后变得不具描述性。
是否有一些 shell 命令或外部程序可以帮助管理此类丢弃目录,以便在我对它们失去兴趣时自动清理它们,我不需要为它们命名,但可以给出一个名字并容易持久化?
如果没有这样的工具,创建一个是个好主意吗?