我正在尝试编写一个shell脚本,在运行时,将设置一些将在调用者的shell中保留的环境变量.
setenv FOO foo
Run Code Online (Sandbox Code Playgroud)
在csh/tcsh中,或
export FOO=foo
Run Code Online (Sandbox Code Playgroud)
在sh/bash中只在脚本执行期间设置它.
我已经知道了
source myscript
Run Code Online (Sandbox Code Playgroud)
将运行脚本的命令而不是启动新的shell,这可能导致设置"调用者"环境.
但这里有一个问题:
我希望这个脚本可以从bash或csh调用.换句话说,我希望任何一个shell的用户都能够运行我的脚本并改变他们的shell环境.所以'source'对我来说不起作用,因为运行csh的用户无法获取bash脚本,而运行bash的用户无法获取csh脚本.
有没有合理的解决方案不需要在脚本上编写和维护两个版本?
假设我有这个脚本
export.bash:
#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"
Run Code Online (Sandbox Code Playgroud)
当我执行脚本,并尝试访问$VAR我没有价值!
echo $VAR
Run Code Online (Sandbox Code Playgroud)
有没有办法$VAR只通过执行export.bash来访问它而不需要采购它?
我想计算给定目录中的所有*bin文件.最初我正在使用for-loop:
var=0
for i in *ls *bin
do
perform computations on $i ....
var+=1
done
echo $var
Run Code Online (Sandbox Code Playgroud)
但是,在某些目录中有太多文件导致错误: Argument list too long
因此,我正在尝试使用管道while-loop:
var=0
ls *.bin | while read i;
do
perform computations on $i
var+=1
done
echo $var
Run Code Online (Sandbox Code Playgroud)
现在的问题是使用管道子壳创建.因此,echo $var回报0.
我该如何处理这个问题?
原始代码:
#!/bin/bash
function entropyImpl {
if [[ -n "$1" ]]
then
if [[ -e "$1" ]]
then
echo "scale = 4; $(gzip -c ${1} | wc -c) / $(cat ${1} …Run Code Online (Sandbox Code Playgroud) 我必须和KSH一起工作(是的,地狱贝壳).我需要使用fork,子程序如下:
#!/bin/ksh
PIPE=PIPE_$$
PIPE_ERR=PIPE_ERR_$$
export TEST_FILS
$(. ./LanceFils.ksh 2>${PIPE_ERR} 1>${PIPE}) &
PID_CHILD=$!
echo "Nom du fichier PIPE: ${PIPE}"
echo "Processus fils : " $!
wait ${PID_CHILD}
echo "Code retour: " $?
echo "Sortie standard de PROC_FILS : " $(cat ${PIPE})
echo "Sortie d'erreur(s) de PROC_FILS : " $(cat ${PIPE_ERR})
echo "Contenu de TEST_FILS: ${TEST_FILS}"
rm -rf ${PIPE}
Run Code Online (Sandbox Code Playgroud)
LanceFils.ksh的内容
#!/bin/ksh
TIMEOUT=5
export TEST_FILS
echo "Je suis le script fils et j'attends ${TIMEOUT} secondes"
echo "Nom du pipe du pere ${PIPE}"
sleep …Run Code Online (Sandbox Code Playgroud)