unix 如何通过管道进入“code”以在Visual Studio Code(VS Code)中打开文件?

yyhrrdl8  于 2023-05-22  发布在  Unix
关注(0)|答案(3)|浏览(170)

我希望能够通过管道将一个文件以及文件和行号导入code,以便Visual Studio Code(VS Code)在当前窗口中打开该文件。我知道code的命令行选项,但我不知道如何以一种有效的方式将某些脚本的输出传递给code
例如,也许我想通过管道传输grep的输出,并在VS Code中打开该文件。下面的命令将打印出文件名和行号。

grep --with-filename --line-number --recursive --max-count 1 --include \*.txt 'Test' . \
| cut --delimiter : --fields 1-2

将输出类似./filename.txt:47的内容。现在,code--goto选项可以按预期处理这个问题,如果这样做的话:

code --reuse-window --goto ./filename.txt:47

但是,如果我尝试管道到code,那么VS Code只是关闭当前窗口,然后打开一个新的空白窗口。

grep --with-filename --line-number --recursive --max-count 1 --include \*.txt 'Test' . \
| cut --delimiter : --fields 1-2 \
| code --reuse-window --goto

我如何使这一工作,使VS代码打开文件的行号在当前窗口?我是不是对bash和管道做了错误的处理,错误地期望它能正常工作?或者这是code特有的问题?

gblwokeq

gblwokeq1#

一种方法是使用xargs

grep --with-filename --line-number --recursive --max-count 1 --include \*.txt 'Test' . \
| cut --delimiter : --fields 1-2 \
| xargs --replace code --reuse-window --goto {}

--replace将假定为{},这样xargs将获取管道的输出,并将其放置在以下命令中出现{}的位置。
我对其他方法也很感兴趣。

h4cxqtbf

h4cxqtbf2#

需要说明的是,这并不是将任何东西 * 导入 * code。您只需要使用命令的输出作为它的参数。
要考虑的一件事是如何处理多个文件。如果你想全部打开,我会使用xargs-n 1选项;下面的命令会对每个已识别的文件运行一次code命令,最终在同一窗口的选项卡中打开所有文件:

grep -Hnrm 1 --include '*.txt' Test . |
  cut -d: -f1-2 |
  xargs -n 1 code --reuse-window --goto

如果你只想打开第一个文件,你可以插入一个head

grep -Hnrm 1 --include '*.txt' Test . |
  cut -d: -f1-2 |
  head -n 1 |
  xargs code --reuse-window --goto

但在这种情况下,您根本不需要xargs;你可以使用普通的旧命令替换:

code --reuse-window --goto \
  "$(grep -Hnrm 1 --include '*.txt' Test . |
     cut -d: -f1-2 | head -n 1)"
vnjpjtjt

vnjpjtjt3#

您是否将标准输入流与命令行(/args)混淆了?你想要code --reuse-window --goto <output of command that produces thing>(即命令的输出被用作 commandline(参数)的一部分),但随后您尝试执行<command that produces thing> | code --reuse-window --goto(即将命令的输出管道传输到消费者的标准输入流中)。
您可以使用<command>(用反引号括起来)或$(<command>)(如果您希望输出被视为单个命令行参数而不是由字段分隔符分割,则也可以用双引号括起来)来替换Bash中命令行中的命令输出。例如code --reuse-window --goto "$(grep --with-filename --line-number --recursive --max-count 1 --include \*.txt 'Test' . | cut --delimiter : --fields 1-2)"

相关问题