如何使以 aux 作为参数调用的 /bin/ps 写入文件?

如何使以 aux 作为参数调用的 /bin/ps 写入文件?

是否有一个命令行参数可以传递给/bin/ps -aux它以使其输出写入文件?


编辑:重新模拟我的问题:

  1. 打开火狐
  2. 启用开发人员偏好设置(或作为快捷方式安装插件)开发者偏好设置
  3. 按 Shift + F4 打开 Scratchpad
  4. 在菜单栏中进入“浏览器”菜单并点击“环境”
  5. 现在在暂存器代码中粘贴此代码,此代码将找到 ps,然后使用命令行选项运行aux>PATH_TO_DESKTOP_me.txt

    var thisWin = Services.ww.activeWindow;
    var env = Cc['@mozilla.org/process/environment;1'].getService(Ci.nsIEnvironment);
    
    var psCommand = 'ps';
    var paths = env.get('PATH').split(':');
    var len = paths.length;
    for (var i = 0; i < len; i++) {
        try {
            var fullyQualified = new FileUtils.File(OS.Path.join(paths[i], psCommand));
            console.log('fullyQualified:', fullyQualified.path)
            if (fullyQualified.exists()) {
                var ps = fullyQualified;
                break;
            }
        } catch (e) {
            // keep checking PATH if we run into NS_ERROR_FILE_UNRECOGNIZED_PATH
        }
    }
    
    if (!ps) {
        console.error("Error: a task list executable not found on filesystem");
        thisWin.alert('Error: a task list executable not found on filesystem');
      throw new Error("Error: a task list executable not found on filesystem");
    }
    
    thisWin.alert('path to ps: "' + ps.path + '"');
    
    var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
    process.init(ps);
    
    var procFinned = {
        observe: function (aSubject, aTopic, aData) {
                thisWin.alert('ps completed');
        }
    };
    
    var filePathToOutputTo = OS.Path.join(OS.Constants.Path.desktopDir, 'me.txt');
    thisWin.alert('will write to file path: "' + filePathToOutputTo + '"');
    var args = ['aux', '>' + filePathToOutputTo];
    var a = process.runAsync(args, args.length, procFinned);
    
  6. 然后按 Ctrl + R 运行代码,或者也可以进入“执行”菜单并单击“运行”执行相同操作。

因此启动 ps 进程的代码就在这里:

var args = ['aux', '>' + filePathToOutputTo];
var a = process.runAsync(args, args.length, procFinned);
  • 尝试过的组合:
    • 引文如下:var args = ['aux', '>"' + filePathToOutputTo + '"'];
    • 作为一个带引号的数组条目值var args = ['aux >"' + filePathToOutputTo + '"'];
    • 作为一个没有引号的数组条目:var args = ['aux >' + filePathToOutputTo + ''];

答案1

通过最低限度接触 JavaScript(从我的角度来看),我建议这样做:

运行bash而不是- 对和ps进行所有搜索和检查,并使用参数 ,启动的进程。bashpsbash-cps.path + ' aux > '+ filePathToOutputTo

这里的整体命令应如下所示:

/bin/bash -c "/bin/ps aux > /path/to/output/file"

答案2

ps查看接受的命令行选项列表手册ps(可在此处访问并运行man ps)显示它没有用于记录到文件的选项。许多命令都没有。但您仍然可以让它执行您想要的操作。

使用>或重定向>>,正如 John1024 所解释的那样发送标准输出>程序复制到/右侧的文件或设备>>听起来这就是你想要的。

但是,如果你想将输出写入文件并也可以亲眼看看在终端中,那么你可能希望使用tee实用程序。

ps aux | tee file

这种用法 ( ) 类似于,但它也会显示输出。如果您想查看输出和| tee file> file附加将其复制到文件(而不是覆盖),使用标志-a

ps aux | tee -a file

该用法()对应于。| tee -a file>> file

怎么tee運作?

tee重复其标准输入,将其写入作为命令行参数给出的文件(或文件列表),并写入标准输出

通常,即当程序或命令以最简单的方式运行时,其标准输入来自用户。这是程序运行时用户输入的内容。

管道操作员,|,将其左侧命令的标准输出连接到其右侧命令的标准输入。在上面的示例中,这会导致将ps aux其输出发送到 的输入tee而不是终端(并tee从 的输出ps aux而不是终端接收其输入)。

tee然后将收到的内容写入file并到达终点站。

顺便说一句,管道的一个常见用途是当您预计命令的输出会很长,并且您希望能够在其中上下导航时。然后您可以将其输出通过管道传输到less。 例如:dmesg | less

重定向/管道错误输出。

上面和John1024 的回答改变标准输出的位置,但它们却离开标准误差也就是说,大多数错误消息(以及一些其他消息,具体取决于程序)不受影响——即使在 中,错误仍会出现在屏幕上,并且ps aux > file不是在文件中。

这通常是您想要的。尤其是在 的情况下ps aux,您不太可能希望在输出文件中出现错误消息——错误是意料之外的,您可能希望立即看到它们。无论如何,错误可能会使您试图制作的文件不适合您的任务,假设您的目标是生成正在运行的进程及其特征的表格。

但是,如果你如果希望错误输出与常规输出一样处理,可以使用&带后缀版本的重定向和管道运算符:

bashUbuntu 中的默认交互式 shell 支持&ed 操作符。除非您有意切换到另一个 shell,否则这就是您正在使用的 shell,因此对于交互式使用(以及对于您知道将使用 运行的脚本bash),您绝对可以随意使用它。

在没有&ed 操作符的 shell 上,重定向/管道错误输出。

有些贝壳(如dash比如提供sh在 Ubuntu 上) 不支持它们。在这种情况下,您会收到类似以下错误:

  • dash: 2: Syntax error: Bad fd number(当尝试使用>&— 相比之下,&>&>>,当不受支持时,被解释为& >& >>做一些不同的事情
  • dash: 1: Syntax error: "&" unexpected(尝试使用时|&

>&当在不支持、>>&和的shell 中工作时|&,您可以按照传统方式通过重定向或管道发送标准输出和标准错误,通过分别指定首先将标准错误重定向到标准输出。

这是实现的2>&1。 (1是个文件描述符用于标准输出,2是标准错误的文件描述符。)

为一个重定向(即,当您想使用>&或 时>>&),请将其放在2>&1最后:

ps aux > file 2>&1
ps aux >> file 2>&1

为一个管道(即,当您想要使用时|&),将2>&1其放在管道前面|

ps aux 2>&1 | tee file
ps aux 2>&1 | tee -a file

答案3

Unix 程序通常将其输出写入“标准输出”,也称为 stdout。使用 shell 的重定向功能,可以将 stdout 发送到文件而不是终端。要将其发送到文件名file,请使用:

ps aux >file

该符号>表示重定向,后面应跟一个文件名。如果文件已存在,则会被覆盖。如果要附加到现有文件,请使用以下符号>>

ps aux >>file

顺便说一句,重定向的一个非常常见的用途是使详细命令静音。为此,可以将其输出重定向到文件/dev/null。这是一个特殊的文件,它会丢弃您发送给它的任何输入。

使用脚本

可以在脚本中使用重定向:

#!/bin/sh
ps aux >file

或者,可以将重定向应用于整个脚本的输出:

myscript >file

您还可以将文件名作为参数传递。假设它myscript包含以下内容:

#!/bin/sh
ps aux >"$1"

$1是命令行上第一个参数的脚本语言。)然后您可以运行:

myscript somefile

并且ps aux命令将被重定向到somefile

相关内容