我的文件中有一堆.cshrc
使用路径的别名:
/projects/project_name/my_name/$CLIENT
我编写了一个简短的脚本,旨在从工作目录路径中获取文件夹名称并将其存储到环境变量中以在各种别名中使用。
set client_name = `echo $PWD | awk -F / '{ print $5; }' | xargs`
setenv CLIENT $client_name
source ~/.cshrc
当前的问题是运行时环境变量不会从之前的值更新。不幸的是,C shell 不支持像 Bash 中那样使用函数(一种潜在的替代方法)。
如何从命令行获取要更新的变量?有更好的方法来实现这一点吗?
谢谢
答案1
您的脚本可能会放入一个空白字符串,$5
因为您的工作目录路径 ( ) 中没有五个变量pwd
,但如果没有看到输入字符串就很难说。如果您需要有关此问题的更多帮助,您将需要使用更多信息更新您的问题,并向我们展示发送到的输入awk
是什么样的。
我不知道是否有办法使别名动态化,但您可以简单地将每个别名转换为 bash 函数。 Bash 函数采用 的形式funct_name () {commands}
,它们甚至接受存储在变量$1
、$2
、$3
、...等中的参数。因此,您可以创建一个 bash 函数,它将动态数据作为参数读取。例如:
test () {
echo $1
}
将表现如下:
$ test abc
abc
$ test foobar
foobar
使用此方法,您可以使用 alias 命令并将其放置echo
在我的示例中的位置,$1
而不是使用$CLIENT
.然而,你甚至不有将每个别名重新创建为 bash 函数并以这种方式使用参数。
从您给我的示例命令来看,您似乎正在从工作目录路径中获取文件夹名称并将其存储到环境变量中以在各种别名中使用它。您可以简单地创建一个 bash 函数来为您完成此任务。作为示例,这里有一个 bash 函数,它将采用您的工作目录的路径,找到第一的文件夹名称(您似乎想要第四个,因此更改此名称),并将其保存到$TEST
环境变量中。
test () {
var=$(pwd | awk -F / '{ print $2; }')
export TEST=$var
}
如果您希望此功能始终可供您使用,请将上述内容添加到您的.bashrc
文件中。每当您启动新的终端窗口时,test
您都可以使用该命令。如果您想将其添加到当前的工作终端(而不必打开新终端),请运行source ~/.bashrc
.然后,您可以像命令一样在终端中运行该函数。您将刚刚运行test
,环境变量将更新,您的别名命令应该可以工作。这是一个实际的例子:
$ pwd
/home/user
$ echo $TEST
$ test
$ echo $TEST
home
意识到:该命令取决于您正在工作的目录。如果您将文件夹更改为根目录,我的示例将在其中放置一个空字符串,$TEST
因为第一个斜杠后面没有字符串。这可能就是为什么awk
在您的情况下打印空字符串,但同样,如果没有看到输入数据,我无法确定。
答案2
考虑添加一个别名,每次更改目录时cd
都会更新变量。$CLIENT
alias cd 'cd \!*; set client_name = `echo $PWD | awk -F / '\''{ print $5; }'\'' | xargs`; setenv CLIENT $client_name'
当然,这也有缺点。例如,它不适用于pushd
or popd
,尽管您可以使用类似的别名来解决这个问题。可能还有其他我没有充分考虑的极端情况。
还要考虑您在 cshrc 文件中保留的别名是否实际上需要成为别名。除非它们以某种方式修改 shell 环境(通过设置变量或更改目录),否则它们可能是独立的 shell 脚本。在这种情况下,您实际上可以使用支持函数的 shell 来编写它们。
答案3
最后我的解决方案是使用脚本将$CLIENT
变量传递到我的别名中。
例子:
创建find_client.sh
,并使用该echo $PWD | awk -F / '{ print $5; }' | xargs
方法在此脚本中查找客户端目录。回显输出并附加完整路径。
在我的别名(.cshrc
文件)中创建一个别名,例如:
alias wk 'cd `find_client.sh`'
到目前为止,这似乎按预期工作。