簡體   English   中英

如何在bash中將命令的行輸出用作單獨的文件名?

[英]How do I use line output from a command as separate file names in bash?

我正在嘗試干凈無錯誤地通過vim文本編輯器中的命令行打開多個文件。 我正在使用bash作為我的外殼。 具體來說,我想在當前工作目錄中打開前23個文件。 我的初始命令是:

$ ls | head -23 | xargs vim

但是,當我這樣做時,在打開所有文件之前,我收到以下錯誤消息:

Vim:警告:輸入不是來自終端

vim退出后,終端中不會顯示新文本。 除了重新打開一個新終端外,我還必須盲目地進行一次reset以恢復正常的終端。

這似乎在這里討論: 在gnu屏幕上使用xargs vim ,以及: 為什么“查找文件名| xargs vim”會導致奇怪的終端行為?

由於發生了警告,因此xargs似乎對vim是禁忌。 (除非您使用子shell和輸入/輸出重定向來做一些令人費解的事情,但我不太喜歡它作為常用命令。並且使用別名/函數... meh。)

解決方案似乎是使用bash的命令替換。 所以我嘗試了:

$ vim $(ls | head -23)

但是文件中包含空格和括號,格式如下:

surname, firstname(email).txt

因此,shell所做的工作(在xarg情況下也是這樣)是提供surname,firstname(email).txt作為兩個單獨的命令參數,這使我在vim中至少擁有要打開的文件數量的兩倍, 實際上都不想打開任何文件。

因此,我認為我需要以某種方式轉義文件名。 我試圖引用命令:

$ vim "$(ls | head -23)"

然后,shell將替換的整個輸出串聯起來,並將作為單個命令參數提供,因此我剩下一個超長文件名,這也不是我想要的。

我也試圖與工作-exec-print-print0-printf選項find ,與在bash陣列的各種事情,可能有些事情我不記得了。 我現在很茫然。

如何使用來自命令的文件名作為單獨的命令參數用引號引起來,以便它們實際起作用?

感謝您提供的所有幫助!

這是一個基於數組的解決方案:

fileset=(*)
vim "${fileset[@]:0:23}"
xargs -a <(ls | head -23) -d '\n' vim

-a告訴xargs從命名文件而不是stdin中讀取參數。 <(...)讓我們在需要文件名的地方傳遞ls / head管道的輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM