Bash 如何在Tcl中包含双引号,或者使用带有空格的密码或文件名命令?

Bash 如何在Tcl中包含双引号,或者使用带有空格的密码或文件名命令?,bash,tcl,whitespace,scp,double-quotes,Bash,Tcl,Whitespace,Scp,Double Quotes,我有两个脚本要在本地计算机外壳中运行 第一个脚本是bashshell,它在自身内部调用expect脚本 bashshell如下所示 BASH SHELL脚本SaveOnRemote.sh BASH脚本SaveOnRemote.sh结束 还有一个我们有scp_ToTarget.expTcl或Expect脚本,它在bash shell中调用 Tcl期望脚本scp_ToTarget.exp 此脚本不工作,我得到未知目录/文件错误 事实上,我无法避免文件名、密码甚至目录中的空格,我必须让脚本正常工作 据

我有两个脚本要在本地计算机外壳中运行 第一个脚本是bashshell,它在自身内部调用expect脚本 bashshell如下所示

BASH SHELL脚本SaveOnRemote.sh BASH脚本SaveOnRemote.sh结束 还有一个我们有scp_ToTarget.expTcl或Expect脚本,它在bash shell中调用

Tcl期望脚本scp_ToTarget.exp 此脚本不工作,我得到未知目录/文件错误 事实上,我无法避免文件名、密码甚至目录中的空格,我必须让脚本正常工作

据我所知,如果我发出这样的命令

scp "/tmp/try me.txt" root@192.168.100.67:"/sd/no tries/" 
它可以工作,我对空格没有问题。 但只要我在Tcl,并添加双报价到

“$src”或“$src”或“$src”

它们都没有按照我想要的方式生成语法,Tcl将双引号改为大括号等等 我陷入了这个问题,我也不知道如何在bash中解决这个问题 或Expect或Tcl

对于在Bash/Tcl中处理不同字符串变量的任何好的参考或web链接,我们将不胜感激
谢谢

在传递参数时,您需要在shell脚本中使用引号:

这很糟糕:

scp_ToTarget.exp  $REMOTE_PASS $REMOTE_IP_ADDR $PC_EXEC_FILE $TARGET_EXEC_FILE
这很好:

scp_ToTarget.exp "$REMOTE_PASS" "$REMOTE_IP_ADDR" "$PC_EXEC_FILE" "$TARGET_EXEC_FILE"
因为您没有引用变量,所以shell将它们扩展为多个单词,Expect脚本接收的参数超过4个

在shell脚本中引用变量后,Expect将按照您的计划接收它们。

谢谢, 我已实施了以下措施

REMOTE_PASS="some_pass_with_whitespaces"
REMOTE_PASS="\"$REMOTE_PASS\""
# I have no clue if the passwords with whitespace or \ works fine for password

#The following line space is defined {\ }
PC_EXEC_FILE="/home/workspace/prog/Modified\ code/test/test_file"
eval PC_EXEC_FILE=$PC_EXEC_FILE
PC_EXEC_FILE="\"$PC_EXEC_FILE\""

#The following line space is included in the variable
TARGET_EXEC_FILE="/sd/1/test/test file target dir/target_file"
eval TARGET_EXEC_FILE=$TARGET_EXEC_FILE
TARGET_EXEC_FILE="\"$TARGET_EXEC_FILE\""

# The script is supposed to handle strings with {spc} and {\spc} used for
# directories but the filenames can not contain spaces 

#Calling the expect script
eval scp_ToTarget.exp  $REMOTE_PASS $REMOTE_IP_ADDR $PC_EXEC_FILE $TARGET_EXEC_FILE
在expect文件中,我在expect{

  "*?assword:*" {    
  send $remote_password\r\n  
  interact 
  }    
它解决了目录中的空格而不是文件名中的空格问题


我仍然对如何解决文件名中的空格感到困惑:(使用这样的字符串是否可以解决问题:

REMOTE\u PASS=“\\\”$REMOTE\u PASS\\\”
我想这是你要求的“双倍逃避”


(我知道这是一个老问题,但我在谷歌搜索时发现了这个问题,其他人也可能发现了这个问题……他们可能会感激找到至少是什么最终解决了我的问题。)

为此,您最好使用ssh密钥。删除
eval spawn
中的
eval
——这将导致您的命令不适用于带空格的参数。谢谢,我实现了如下远程\u PASS=“带空格的某些\u PASS”eval REMOTE\u PASS=$REMOTE\u PASS\35;定义了以下行空间{\}PC\u EXEC\u文件=“/home/workspace/prog/Modified\code/test/test\u file”eval REMOTE\u PASS=$REMOTE\u PASS的目的是什么??其作用是尝试将REMOTE\u PASS设置为密码的第一个字,并尝试将其余字作为命令执行:
REMOTE\u PASS=“foo bar”“eval REMOTE_PASS=$REMOTE_PASS#==>bash:bar:command not found
是的,你是对的,我必须从REMOTE_PASS中取出eval,我仍然无法解决包含空格的文件名的问题。你有什么建议吗?谢谢你在shell脚本中使用双引号吗?我向你展示了如何做。这就是解决方案。
REMOTE_PASS="some_pass_with_whitespaces"
REMOTE_PASS="\"$REMOTE_PASS\""
# I have no clue if the passwords with whitespace or \ works fine for password

#The following line space is defined {\ }
PC_EXEC_FILE="/home/workspace/prog/Modified\ code/test/test_file"
eval PC_EXEC_FILE=$PC_EXEC_FILE
PC_EXEC_FILE="\"$PC_EXEC_FILE\""

#The following line space is included in the variable
TARGET_EXEC_FILE="/sd/1/test/test file target dir/target_file"
eval TARGET_EXEC_FILE=$TARGET_EXEC_FILE
TARGET_EXEC_FILE="\"$TARGET_EXEC_FILE\""

# The script is supposed to handle strings with {spc} and {\spc} used for
# directories but the filenames can not contain spaces 

#Calling the expect script
eval scp_ToTarget.exp  $REMOTE_PASS $REMOTE_IP_ADDR $PC_EXEC_FILE $TARGET_EXEC_FILE
  "*?assword:*" {    
  send $remote_password\r\n  
  interact 
  }