相关疑难解决方法(0)

shell脚本可以设置调用shell的环境变量吗?

我正在尝试编写一个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脚本.

有没有合理的解决方案不需要在脚本上编写和维护两个版本?

bash shell csh tcsh

396
推荐指数
8
解决办法
46万
查看次数

我可以从bash脚本将变量导出到环境中而不需要获取它吗?

假设我有这个脚本

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来访问它而不需要采购它?

unix bash shell environment-variables

247
推荐指数
6
解决办法
27万
查看次数

Bash中的循环子shell困境

我想计算给定目录中的所有*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)

bash shell

24
推荐指数
2
解决办法
2万
查看次数

在KSH中将变量从子项传递给父项

我必须和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)

variables ksh fork subroutine

0
推荐指数
1
解决办法
3919
查看次数

标签 统计

bash ×3

shell ×3

csh ×1

environment-variables ×1

fork ×1

ksh ×1

subroutine ×1

tcsh ×1

unix ×1

variables ×1