在CD之后执行ls的脚本

时间:2019-01-06 06:23:45

标签: linux bash shell

我试图制作一个bash脚本,每次执行cd命令时,我都会获得新文件夹(ls)的文件和文件夹列表。

我找到了下一个bash函数:

#!/bin/bash

cs() { cd "$@" && ls; }

我保存了它:~/.scripts/cs。这工作了。我将其添加到PATH中的.bash_profile中:

PATH=$PATH:$HOME/.scripts
export PATH

当我像. .scripts/cs一样执行它时,它可以工作,但是当我在另一个窗口中时,什么也没发生。我以为我需要在脚本中调用该函数,所以我对其进行了修改:

#!/bin/bash

cs() { cd "$@" && ls; }

cs

现在,当我在其他窗口中执行cs时,我只是获得正确的ls命令,但它不会更改目录。

我已读完所有书,得出的结论是cs命令在“子外壳”中执行,而cd命令在此处执行,在我当前的外壳中,我仅收到ls。我尝试在.bashrc文件中做一个别名:

alias cs='. cs'

但是说实话,我不知道会发生什么,我只会遇到以下错误:

bash: /home/ggf/.scripts/cs: line 4: syntax error near unexpected token `('
bash: /home/ggf/.scripts/cs: line 4: `cs() { cd "$@" && ls; }'

任何解决方案或建议?对不起,我的英语不好,我来自阿根廷。对上一个错误也有解决方案吗?我认为这对其他场合很有用。

1 个答案:

答案 0 :(得分:1)

就放

cs() { cd "$@" && ls; }
在您的.bashrc

。跳过脚本文件,别名等。请注意,您将必须打开新的终端才能获得干净的外壳,否则它将记住别名并尝试继续使用它。

为什么要在.bashrc中进行解释:如果将其放在PATH中的单独文件中,则默认情况下它将在子进程中运行;它所做的更改(包括更改目录,定义函数和别名等)将在该子流程本地进行。有一些方法可以避免这种情况,但是它们都涉及额外的输入或更改.bashrc(或其他一些Shell启动文件):

  • 您可以使用.source运行该文件,这在每次使用该函数时都需要进行额外的键入。 (注意:在这种情况下,您将不会使用函数,只需直接执行cd "$@" && ls文件即可。)
  • 您可以为文件.source创建一个别名,但是随后您必须修改.bashrc以包括该别名定义。
  • 您可以将函数(或别名)定义放入文件中,并使用.source进行加载,但这会在每次打开外壳程序时都要进行额外的键入。
  • 您可以在.中使用source.bashrc来自动执行此操作,但是现在您正在修改.bashrc,也可以直接将其定义在那里。

    (例外:有些人喜欢将其shell启动文件组织成一个别名定义文件,一个函数定义,另一个参数设置等...然后source来自{{1} }和/或其他Shell启动文件。某些操作系统甚至附带了默认的启动文件来支持此功能。如果您发现这种组织有用,请务必使用它。)

顺便说一句,有时我会看到人们为这样的问题创建过于复杂的解决方案,例如拥有一个别名来提供源文件以创建函数... IMO,除非这种复杂性实际上在做一些有用的事情,否则就把它丢掉。在这种情况下,函数可以完成所需的所有操作,因此您应该使用它。