Vim启动项目文件-bash脚本

Vim启动项目文件-bash脚本,bash,shell,vim,Bash,Shell,Vim,该程序应打开3个vim终端,每个终端中打开3个文件。我在每个子文件夹中都有一个startup.txt文件,其中包含我要启动的每个文件的名称。(每行一个名字) 需要修复的问题: 1 #!/bin/bash 2 3 ADDR_FILE=~/Documents/CEDA #address to the file 4 ADDR_CEDA=$ADDR_FILE/ceda_lib #address for ceda_lib 5 ADDR_GENERAL=$AD

该程序应打开3个vim终端,每个终端中打开3个文件。我在每个子文件夹中都有一个startup.txt文件,其中包含我要启动的每个文件的名称。(每行一个名字)

需要修复的问题:

  1 #!/bin/bash
  2 
  3 ADDR_FILE=~/Documents/CEDA         #address to the file
  4 ADDR_CEDA=$ADDR_FILE/ceda_lib      #address for ceda_lib
  5 ADDR_GENERAL=$ADDR_FILE/general    #address for general
  6 ADDR_CLI=$ADDR_FILE/CLI            #address for CLI
  7 
  8 function getFile
  9 {
 10     awk 'NR=='$1 $2/startup.txt
 11 }
 12 
 13 for i in $ADDR_CEDA $ADDR_GENERAL $ADDR_CLI; do
 14     CMD_2=""
 15     CMD_3=""
 16     if [ $(getFile 2 $i) ]; then                    #checks if line 2 isn't blank
 17         CMD_2=-c "vsp $i/$(getFile 2 $i)"
 18         if [ $(getFile 3 $i) ]; then                #checks if line 3 isn't blank
 19             CMD_3=-c "vsp $i/$(getFile 3 $i)"
 20         fi
 21     fi
 22     gnome-terminal -e "vim $i/$(getFile 1 $i) $CMD_2 $CMD_3"
 23 done
file1.cpp
file2.hpp
file3.hpp
  1 #!/bin/bash
  2 
  3 ADDR_FILE=~/Documents/CEDA         #address to the file
  4 ADDR_CEDA=$ADDR_FILE/ceda_lib      #address for ceda_lib
  5 ADDR_GENERAL=$ADDR_FILE/general    #address for general
  6 ADDR_CLI=$ADDR_FILE/CLI            #address for CLI
  7 ADDRESSES="$ADDR_CEDA $ADDR_GENERAL $ADDR_CLI"
  8 
  9 if [ $1 ]; then                                         #checks for parameters
 10     if [ $1 = "-f" ] || [ $1 = "--files" ]; then
 11         for i in $ADDRESSES; do
 12         nautilus $i &
 13         done
 14         exit 0                                          #end script
 15     fi
 16 fi
 17 
 18 function getFile
 19 {
 20     awk 'NR=='$1 $2/startup.txt
 21 }
 22 
 23 for i in $ADDRESSES; do
 24     CMD_2=""
 25     CMD_3=""
 26     if [ $(getFile 2 $i) ]; then                    #checks if line 2 isn't blank
 27         CMD_2="-c \"vsp $i/$(getFile 2 $i)\""
 28         if [ $(getFile 3 $i) ]; then                #checks if line 3 isn't blank
 29             CMD_3="-c \"vsp $i/$(getFile 3 $i)\""
 30         fi
 31     fi
 32     gnome-terminal -e "vim $i/$(getFile 1 $i) $CMD_2 $CMD_3"
 33 done
如何使第22行上的命令可执行?当我尝试运行此命令时,它会给我以下错误(但它会在每个startup.txt中打开第一个文件)


错误:

  1 #!/bin/bash
  2 
  3 ADDR_FILE=~/Documents/CEDA         #address to the file
  4 ADDR_CEDA=$ADDR_FILE/ceda_lib      #address for ceda_lib
  5 ADDR_GENERAL=$ADDR_FILE/general    #address for general
  6 ADDR_CLI=$ADDR_FILE/CLI            #address for CLI
  7 
  8 function getFile
  9 {
 10     awk 'NR=='$1 $2/startup.txt
 11 }
 12 
 13 for i in $ADDR_CEDA $ADDR_GENERAL $ADDR_CLI; do
 14     CMD_2=""
 15     CMD_3=""
 16     if [ $(getFile 2 $i) ]; then                    #checks if line 2 isn't blank
 17         CMD_2=-c "vsp $i/$(getFile 2 $i)"
 18         if [ $(getFile 3 $i) ]; then                #checks if line 3 isn't blank
 19             CMD_3=-c "vsp $i/$(getFile 3 $i)"
 20         fi
 21     fi
 22     gnome-terminal -e "vim $i/$(getFile 1 $i) $CMD_2 $CMD_3"
 23 done
file1.cpp
file2.hpp
file3.hpp
  1 #!/bin/bash
  2 
  3 ADDR_FILE=~/Documents/CEDA         #address to the file
  4 ADDR_CEDA=$ADDR_FILE/ceda_lib      #address for ceda_lib
  5 ADDR_GENERAL=$ADDR_FILE/general    #address for general
  6 ADDR_CLI=$ADDR_FILE/CLI            #address for CLI
  7 ADDRESSES="$ADDR_CEDA $ADDR_GENERAL $ADDR_CLI"
  8 
  9 if [ $1 ]; then                                         #checks for parameters
 10     if [ $1 = "-f" ] || [ $1 = "--files" ]; then
 11         for i in $ADDRESSES; do
 12         nautilus $i &
 13         done
 14         exit 0                                          #end script
 15     fi
 16 fi
 17 
 18 function getFile
 19 {
 20     awk 'NR=='$1 $2/startup.txt
 21 }
 22 
 23 for i in $ADDRESSES; do
 24     CMD_2=""
 25     CMD_3=""
 26     if [ $(getFile 2 $i) ]; then                    #checks if line 2 isn't blank
 27         CMD_2="-c \"vsp $i/$(getFile 2 $i)\""
 28         if [ $(getFile 3 $i) ]; then                #checks if line 3 isn't blank
 29             CMD_3="-c \"vsp $i/$(getFile 3 $i)\""
 30         fi
 31     fi
 32     gnome-terminal -e "vim $i/$(getFile 1 $i) $CMD_2 $CMD_3"
 33 done
/home/george/bin/project:第17行:找不到vsp:命令

/home/george/bin/project:第19行:找不到vsp:命令

/home/george/bin/project:第17行:找不到vsp:命令

/home/george/bin/project:第19行:找不到vsp:命令


更新代码:

  1 #!/bin/bash
  2 
  3 ADDR_FILE=~/Documents/CEDA         #address to the file
  4 ADDR_CEDA=$ADDR_FILE/ceda_lib      #address for ceda_lib
  5 ADDR_GENERAL=$ADDR_FILE/general    #address for general
  6 ADDR_CLI=$ADDR_FILE/CLI            #address for CLI
  7 
  8 function getFile
  9 {
 10     awk 'NR=='$1 $2/startup.txt
 11 }
 12 
 13 for i in $ADDR_CEDA $ADDR_GENERAL $ADDR_CLI; do
 14     CMD_2=""
 15     CMD_3=""
 16     if [ $(getFile 2 $i) ]; then                    #checks if line 2 isn't blank
 17         CMD_2=-c "vsp $i/$(getFile 2 $i)"
 18         if [ $(getFile 3 $i) ]; then                #checks if line 3 isn't blank
 19             CMD_3=-c "vsp $i/$(getFile 3 $i)"
 20         fi
 21     fi
 22     gnome-terminal -e "vim $i/$(getFile 1 $i) $CMD_2 $CMD_3"
 23 done
file1.cpp
file2.hpp
file3.hpp
  1 #!/bin/bash
  2 
  3 ADDR_FILE=~/Documents/CEDA         #address to the file
  4 ADDR_CEDA=$ADDR_FILE/ceda_lib      #address for ceda_lib
  5 ADDR_GENERAL=$ADDR_FILE/general    #address for general
  6 ADDR_CLI=$ADDR_FILE/CLI            #address for CLI
  7 ADDRESSES="$ADDR_CEDA $ADDR_GENERAL $ADDR_CLI"
  8 
  9 if [ $1 ]; then                                         #checks for parameters
 10     if [ $1 = "-f" ] || [ $1 = "--files" ]; then
 11         for i in $ADDRESSES; do
 12         nautilus $i &
 13         done
 14         exit 0                                          #end script
 15     fi
 16 fi
 17 
 18 function getFile
 19 {
 20     awk 'NR=='$1 $2/startup.txt
 21 }
 22 
 23 for i in $ADDRESSES; do
 24     CMD_2=""
 25     CMD_3=""
 26     if [ $(getFile 2 $i) ]; then                    #checks if line 2 isn't blank
 27         CMD_2="-c \"vsp $i/$(getFile 2 $i)\""
 28         if [ $(getFile 3 $i) ]; then                #checks if line 3 isn't blank
 29             CMD_3="-c \"vsp $i/$(getFile 3 $i)\""
 30         fi
 31     fi
 32     gnome-terminal -e "vim $i/$(getFile 1 $i) $CMD_2 $CMD_3"
 33 done
示例startup.txt:

  1 #!/bin/bash
  2 
  3 ADDR_FILE=~/Documents/CEDA         #address to the file
  4 ADDR_CEDA=$ADDR_FILE/ceda_lib      #address for ceda_lib
  5 ADDR_GENERAL=$ADDR_FILE/general    #address for general
  6 ADDR_CLI=$ADDR_FILE/CLI            #address for CLI
  7 
  8 function getFile
  9 {
 10     awk 'NR=='$1 $2/startup.txt
 11 }
 12 
 13 for i in $ADDR_CEDA $ADDR_GENERAL $ADDR_CLI; do
 14     CMD_2=""
 15     CMD_3=""
 16     if [ $(getFile 2 $i) ]; then                    #checks if line 2 isn't blank
 17         CMD_2=-c "vsp $i/$(getFile 2 $i)"
 18         if [ $(getFile 3 $i) ]; then                #checks if line 3 isn't blank
 19             CMD_3=-c "vsp $i/$(getFile 3 $i)"
 20         fi
 21     fi
 22     gnome-terminal -e "vim $i/$(getFile 1 $i) $CMD_2 $CMD_3"
 23 done
file1.cpp
file2.hpp
file3.hpp
  1 #!/bin/bash
  2 
  3 ADDR_FILE=~/Documents/CEDA         #address to the file
  4 ADDR_CEDA=$ADDR_FILE/ceda_lib      #address for ceda_lib
  5 ADDR_GENERAL=$ADDR_FILE/general    #address for general
  6 ADDR_CLI=$ADDR_FILE/CLI            #address for CLI
  7 ADDRESSES="$ADDR_CEDA $ADDR_GENERAL $ADDR_CLI"
  8 
  9 if [ $1 ]; then                                         #checks for parameters
 10     if [ $1 = "-f" ] || [ $1 = "--files" ]; then
 11         for i in $ADDRESSES; do
 12         nautilus $i &
 13         done
 14         exit 0                                          #end script
 15     fi
 16 fi
 17 
 18 function getFile
 19 {
 20     awk 'NR=='$1 $2/startup.txt
 21 }
 22 
 23 for i in $ADDRESSES; do
 24     CMD_2=""
 25     CMD_3=""
 26     if [ $(getFile 2 $i) ]; then                    #checks if line 2 isn't blank
 27         CMD_2="-c \"vsp $i/$(getFile 2 $i)\""
 28         if [ $(getFile 3 $i) ]; then                #checks if line 3 isn't blank
 29             CMD_3="-c \"vsp $i/$(getFile 3 $i)\""
 30         fi
 31     fi
 32     gnome-terminal -e "vim $i/$(getFile 1 $i) $CMD_2 $CMD_3"
 33 done

请注意,我是bash脚本的初学者。如有任何一般性建议,将不胜感激

我不确定您想用
vim
做什么,因为我没有使用那种语法,但这里有一些提示

您的
getline()
函数可以很容易地替换为一个简单的
sed
命令。如果
文件
包含:

line 1
line 2
line 3
尝试运行:

sed '2!d' file
您将看到它删除除第2行以外的所有行。因此,您的
vim
命令开始如下所示:

vim -c vsp $i/$(sed '2!d' $i)
for i in "file1" "file2" "file3" ; do
   xterm -e "vim -c vsp $i/$(sed '2!d' $i) ... " &
done
如果需要三个
xterm
s,则需要启动三个,并告诉每个人执行一个新的
vim
。如果希望它们同时运行,则需要在最后使用
&
作为背景。这意味着您的脚本开始如下所示:

vim -c vsp $i/$(sed '2!d' $i)
for i in "file1" "file2" "file3" ; do
   xterm -e "vim -c vsp $i/$(sed '2!d' $i) ... " &
done

我不确定您正试图用
vim
做什么,因为我没有使用该语法,但这里有一些提示

您的
getline()
函数可以很容易地替换为一个简单的
sed
命令。如果
文件
包含:

line 1
line 2
line 3
尝试运行:

sed '2!d' file
您将看到它删除除第2行以外的所有行。因此,您的
vim
命令开始如下所示:

vim -c vsp $i/$(sed '2!d' $i)
for i in "file1" "file2" "file3" ; do
   xterm -e "vim -c vsp $i/$(sed '2!d' $i) ... " &
done
如果需要三个
xterm
s,则需要启动三个,并告诉每个人执行一个新的
vim
。如果希望它们同时运行,则需要在最后使用
&
作为背景。这意味着您的脚本开始如下所示:

vim -c vsp $i/$(sed '2!d' $i)
for i in "file1" "file2" "file3" ; do
   xterm -e "vim -c vsp $i/$(sed '2!d' $i) ... " &
done

工作代码:

  1 #!/bin/bash
  2 
  3 ADDR_FILE=~/Documents/CEDA         #address to the file
  4 ADDR_CEDA=$ADDR_FILE/ceda_lib      #address for ceda_lib
  5 ADDR_GENERAL=$ADDR_FILE/general    #address for general
  6 ADDR_CLI=$ADDR_FILE/CLI            #address for CLI
  7 
  8 function getFile
  9 {
 10     awk 'NR=='$1 $2/startup.txt
 11 }
 12 
 13 for i in $ADDR_CEDA $ADDR_GENERAL $ADDR_CLI; do
 14     CMD_2=""
 15     CMD_3=""
 16     if [ $(getFile 2 $i) ]; then                    #checks if line 2 isn't blank
 17         CMD_2=-c "vsp $i/$(getFile 2 $i)"
 18         if [ $(getFile 3 $i) ]; then                #checks if line 3 isn't blank
 19             CMD_3=-c "vsp $i/$(getFile 3 $i)"
 20         fi
 21     fi
 22     gnome-terminal -e "vim $i/$(getFile 1 $i) $CMD_2 $CMD_3"
 23 done
file1.cpp
file2.hpp
file3.hpp
  1 #!/bin/bash
  2 
  3 ADDR_FILE=~/Documents/CEDA         #address to the file
  4 ADDR_CEDA=$ADDR_FILE/ceda_lib      #address for ceda_lib
  5 ADDR_GENERAL=$ADDR_FILE/general    #address for general
  6 ADDR_CLI=$ADDR_FILE/CLI            #address for CLI
  7 ADDRESSES="$ADDR_CEDA $ADDR_GENERAL $ADDR_CLI"
  8 
  9 if [ $1 ]; then                                         #checks for parameters
 10     if [ $1 = "-f" ] || [ $1 = "--files" ]; then
 11         for i in $ADDRESSES; do
 12         nautilus $i &
 13         done
 14         exit 0                                          #end script
 15     fi
 16 fi
 17 
 18 function getFile
 19 {
 20     awk 'NR=='$1 $2/startup.txt
 21 }
 22 
 23 for i in $ADDRESSES; do
 24     CMD_2=""
 25     CMD_3=""
 26     if [ $(getFile 2 $i) ]; then                    #checks if line 2 isn't blank
 27         CMD_2="-c \"vsp $i/$(getFile 2 $i)\""
 28         if [ $(getFile 3 $i) ]; then                #checks if line 3 isn't blank
 29             CMD_3="-c \"vsp $i/$(getFile 3 $i)\""
 30         fi
 31     fi
 32     gnome-terminal -e "vim $i/$(getFile 1 $i) $CMD_2 $CMD_3"
 33 done
随着时间的推移,我会给它添加更多内容,但它只做了我希望它做的最起码的事情:D感谢你们所有的帮助


附:我已经多次编辑我的问题

工作代码:

  1 #!/bin/bash
  2 
  3 ADDR_FILE=~/Documents/CEDA         #address to the file
  4 ADDR_CEDA=$ADDR_FILE/ceda_lib      #address for ceda_lib
  5 ADDR_GENERAL=$ADDR_FILE/general    #address for general
  6 ADDR_CLI=$ADDR_FILE/CLI            #address for CLI
  7 
  8 function getFile
  9 {
 10     awk 'NR=='$1 $2/startup.txt
 11 }
 12 
 13 for i in $ADDR_CEDA $ADDR_GENERAL $ADDR_CLI; do
 14     CMD_2=""
 15     CMD_3=""
 16     if [ $(getFile 2 $i) ]; then                    #checks if line 2 isn't blank
 17         CMD_2=-c "vsp $i/$(getFile 2 $i)"
 18         if [ $(getFile 3 $i) ]; then                #checks if line 3 isn't blank
 19             CMD_3=-c "vsp $i/$(getFile 3 $i)"
 20         fi
 21     fi
 22     gnome-terminal -e "vim $i/$(getFile 1 $i) $CMD_2 $CMD_3"
 23 done
file1.cpp
file2.hpp
file3.hpp
  1 #!/bin/bash
  2 
  3 ADDR_FILE=~/Documents/CEDA         #address to the file
  4 ADDR_CEDA=$ADDR_FILE/ceda_lib      #address for ceda_lib
  5 ADDR_GENERAL=$ADDR_FILE/general    #address for general
  6 ADDR_CLI=$ADDR_FILE/CLI            #address for CLI
  7 ADDRESSES="$ADDR_CEDA $ADDR_GENERAL $ADDR_CLI"
  8 
  9 if [ $1 ]; then                                         #checks for parameters
 10     if [ $1 = "-f" ] || [ $1 = "--files" ]; then
 11         for i in $ADDRESSES; do
 12         nautilus $i &
 13         done
 14         exit 0                                          #end script
 15     fi
 16 fi
 17 
 18 function getFile
 19 {
 20     awk 'NR=='$1 $2/startup.txt
 21 }
 22 
 23 for i in $ADDRESSES; do
 24     CMD_2=""
 25     CMD_3=""
 26     if [ $(getFile 2 $i) ]; then                    #checks if line 2 isn't blank
 27         CMD_2="-c \"vsp $i/$(getFile 2 $i)\""
 28         if [ $(getFile 3 $i) ]; then                #checks if line 3 isn't blank
 29             CMD_3="-c \"vsp $i/$(getFile 3 $i)\""
 30         fi
 31     fi
 32     gnome-terminal -e "vim $i/$(getFile 1 $i) $CMD_2 $CMD_3"
 33 done
随着时间的推移,我会给它添加更多内容,但它只做了我希望它做的最起码的事情:D感谢你们所有的帮助


附:我已经多次编辑我的问题

您可能需要对3个终端执行三次
xterm-e“vi something”&
。您以前有
vim-c
,现在
-c
已经消失了。另外,在
gnome terminal
行的末尾需要
&
-c“vsp$i/$(getFile 2$i)”我应该把“&”放在哪里?“&”的作用是什么?
&
gnome terminal
开始在行的末尾,这样终端在后台运行,第二个可以在第一个退出之前启动,即三个终端并行运行。要调试脚本,请尝试运行
bash-xv yourScript
,您可能需要
xterm-e“vi something”&
为3个终端执行了三次。您以前有
vim-c
,现在
-c
已经消失了。此外,您需要
&
gnome终端
行的末尾。c仍然在那里,但在引号之外。-c“vsp$i/$(getFile 2$i)“我应该把“&”放在哪里?”&“do?
&
位于从
gnome terminal
开始的行的末尾,这样终端可以在后台运行,第二个可以在第一个退出之前启动,即三个终端并行运行。要调试脚本,请尝试运行
bash-xv yourScript
,我希望它更直观,这就是我制作函数的原因(+我学会了如何制作函数:D)。现在我的代码面临着不同的问题。我会更新上面的问题,所以请再次检查:我希望它更直观,这就是为什么我做了函数(+我学会了如何做函数:D)。现在我的代码面临着不同的问题。我会更新上面的问题,所以请再次检查:D