如何在Shell脚本中进入指定目录并执行目标文件(解决Redis-cli命令未找到异常)
解决Shell脚本中redis-cli命令找不到的问题
嘿,这个问题我太熟了!脚本里找不到redis-cli本质是环境变量PATH的问题——你手动在终端cd到Redis的src目录后,交互式shell的PATH可能包含当前目录(./),但脚本执行时的子shell环境不一定有这个配置,所以直接敲redis-cli会找不到命令。下面给你几个靠谱的解决办法,直接适配你的脚本:
方案1:用绝对路径调用redis-cli(最稳妥)
直接用redis-cli的完整绝对路径,不管脚本当前在哪个目录都能找到。修改你的脚本里的调用部分:
#!/bin/bash REDIS_SRC_DIR=/Users/huangkunlun/Work/soft/redis/redis-6.0.10/src HOST_TEST=redis-test-in.shantaijk.cn HOST_DEV=r-uf61x52g8b0cketmk7.redis.rds.aliyuncs.com env=$1 echo "environment is ${env}" cd ${REDIS_SRC_DIR} echo "cd redis directory $(pwd)" if [[ ${env} == "test" ]]; then # 用绝对路径调用 ${REDIS_SRC_DIR}/redis-cli -h ${HOST_TEST} -p 6379 -a Cloudhis1234 elif [[ ${env} == "dev" ]]; then # 同样用绝对路径 ${REDIS_SRC_DIR}/redis-cli -h ${HOST_DEV} -p 6379 -a Cloudhis1234 else echo "no env args is specified, exit..." fi
这里直接用你定义的REDIS_SRC_DIR变量拼接路径,既清晰又方便后续修改路径。
方案2:cd后用相对路径调用(简洁)
既然已经cd到了Redis的src目录,直接用./redis-cli指定当前目录下的可执行文件,这样shell就会优先在当前目录查找:
#!/bin/bash REDIS_SRC_DIR=/Users/huangkunlun/Work/soft/redis/redis-6.0.10/src HOST_TEST=redis-test-in.shantaijk.cn HOST_DEV=r-uf61x52g8b0cketmk7.redis.rds.aliyuncs.com env=$1 echo "environment is ${env}" cd ${REDIS_SRC_DIR} echo "cd redis directory $(pwd)" if [[ ${env} == "test" ]]; then ./redis-cli -h ${HOST_TEST} -p 6379 -a Cloudhis1234 elif [[ ${env} == "dev" ]]; then ./redis-cli -h ${HOST_DEV} -p 6379 -a Cloudhis1234 else echo "no env args is specified, exit..." fi
方案3:把Redis的src目录加入脚本的PATH(适合多次调用)
如果你的脚本里需要多次调用redis相关命令,可以先把src目录加入PATH,之后直接敲命令就行:
#!/bin/bash REDIS_SRC_DIR=/Users/huangkunlun/Work/soft/redis/redis-6.0.10/src # 把Redis的src目录加入PATH export PATH="${REDIS_SRC_DIR}:${PATH}" HOST_TEST=redis-test-in.shantaijk.cn HOST_DEV=r-uf61x52g8b0cketmk7.redis.rds.aliyuncs.com env=$1 echo "environment is ${env}" echo "current PATH: ${PATH}" if [[ ${env} == "test" ]]; then redis-cli -h ${HOST_TEST} -p 6379 -a Cloudhis1234 elif [[ ${env} == "dev" ]]; then redis-cli -h ${HOST_DEV} -p 6379 -a Cloudhis1234 else echo "no env args is specified, exit..." fi
这个方案的好处是后续调用redis-cli、redis-server等命令都不用写路径,很方便。
另外提醒一句:脚本里用-a参数明文传密码不太安全,建议改成通过环境变量或者交互式输入,不过这是题外话啦~
内容的提问来源于stack exchange,提问作者MVP
相关产品推荐
相关产品推荐

