是否有一个命令行参数可以传递给/bin/ps -aux
它以使其输出写入文件?
编辑:重新模拟我的问题:
- 打开火狐
- 启用开发人员偏好设置(或作为快捷方式安装插件)开发者偏好设置)
- 按 Shift + F4 打开 Scratchpad
- 在菜单栏中进入“浏览器”菜单并点击“环境”
现在在暂存器代码中粘贴此代码,此代码将找到 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);
然后按 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
进行所有搜索和检查,并使用参数 ,启动的进程。bash
ps
bash
-c
ps.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
,您不太可能希望在输出文件中出现错误消息——错误是意料之外的,您可能希望立即看到它们。无论如何,错误可能会使您试图制作的文件不适合您的任务,假设您的目标是生成正在运行的进程及其特征的表格。
但是,如果你做如果希望错误输出与常规输出一样处理,可以使用&
带后缀版本的重定向和管道运算符:
>&
(或者&>
)代替>
:ps aux >& file
或ps aux &> file
&>>
(不是>>&
)代替>>
:。ps aux &>> file
|&
(不是&|
)代替|
: ,或ps aux |& tee file
ps aux |& tee -a file to append.
bash
Ubuntu 中的默认交互式 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
。