我试图制作一个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; }'
任何解决方案或建议?对不起,我的英语不好,我来自阿根廷。对上一个错误也有解决方案吗?我认为这对其他场合很有用。
答案 0 :(得分:1)
就放
cs() { cd "$@" && ls; }
在您的.bashrc
中。跳过脚本文件,别名等。请注意,您将必须打开新的终端才能获得干净的外壳,否则它将记住别名并尝试继续使用它。
为什么要在.bashrc中进行解释:如果将其放在PATH
中的单独文件中,则默认情况下它将在子进程中运行;它所做的更改(包括更改目录,定义函数和别名等)将在该子流程本地进行。有一些方法可以避免这种情况,但是它们都涉及额外的输入或更改.bashrc
(或其他一些Shell启动文件):
.
或source
运行该文件,这在每次使用该函数时都需要进行额外的键入。 (注意:在这种情况下,您将不会使用函数,只需直接执行cd "$@" && ls
文件即可。).
或source
创建一个别名,但是随后您必须修改.bashrc
以包括该别名定义。.
或source
进行加载,但这会在每次打开外壳程序时都要进行额外的键入。您可以在.
中使用source
或.bashrc
来自动执行此操作,但是现在您正在修改.bashrc,也可以直接将其定义在那里。
(例外:有些人喜欢将其shell启动文件组织成一个别名定义文件,一个函数定义,另一个参数设置等...然后source
来自{{1} }和/或其他Shell启动文件。某些操作系统甚至附带了默认的启动文件来支持此功能。如果您发现这种组织有用,请务必使用它。)
顺便说一句,有时我会看到人们为这样的问题创建过于复杂的解决方案,例如拥有一个别名来提供源文件以创建函数... IMO,除非这种复杂性实际上在做一些有用的事情,否则就把它丢掉。在这种情况下,函数可以完成所需的所有操作,因此您应该使用它。