标签: sh

CD进入以“-”开头的目录

我在 cd-ing 到名为“--Recovery Files”的文件夹时遇到问题,不记得如何转义文件名中的破折号。有任何想法吗?

bash sh

5
推荐指数
3
解决办法
188
查看次数

用另一个文件的内容替换文件中的关键字的shell脚本

我将创建一个 .sh 以使用其他文件的内容替换文件中的特定关键字。

  • template.html 包含一个唯一的字符串“ PLACEHOLDER
  • 它必须替换为文件“contents.html”的内容

sed 可用于替换关键字:

value="hello superuser"
sed -e "s/__PLACEHOLDER__/${value}/g" template.html > page.html
Run Code Online (Sandbox Code Playgroud)

所以我尝试了以下方法:

value=$(<contents.html)
sed -e "s/__PLACEHOLDER__/${value}/g" template.html > page.html
Run Code Online (Sandbox Code Playgroud)

并收到以下错误消息:替代模式内未转义的换行符

请问这种情况怎么处理?

谢谢!

shell sed sh find-and-replace

5
推荐指数
1
解决办法
4870
查看次数

如何在不等待整行的情况下为程序输出添加一个字符串?

我有一个使用 SSH 在远程服务器上运行命令的脚本。我想将字符串添加Remote:到输出的每一行,但我不希望每一行都被延迟,直到整行可用。这是我的命令的输出:

$ myproject-db-push my_database_name
从数据库导出...完成
归档数据...完成
上传档案到远程...完成
在远程运行安装脚本
远程:将存档解压缩到临时目录...完成
远程:使用数据库:my_database_name
远程:删除集合:
远程:- my_collection_foo
远程:- my_collection_bar
远程:导入新数据...完成

在这种情况下,我是这样使用的sed

echo "$INSTALLCMD" | ssh -T "deploy@$SERVER" | sed -u "s/^/Remote: /"
Run Code Online (Sandbox Code Playgroud)

问题是,正如我所解释的,没有部分行打印到屏幕上。如果我移除| sed零件,它会按预期工作。首先是这样写的:

正在导入新数据... 

几秒钟后,该行完成:

正在导入新数据...完成

我假设sed只能逐行工作。我尝试将其设置为无缓冲,但它仍然等待整行。有没有另一种方法来实现这一点?

bash sed sh shell-script

5
推荐指数
1
解决办法
485
查看次数

Ssh X11 转发与默认 shell 混淆

bash我的 bash 配置文件中有一个特定的代码:

$ cat ~/.bash_profile
#!/usr/bin/env bash

echo "SHELL: $SHELL"
function printfiles() {
  while IFS='' read -r _file || [[ -n "$_file" ]]; do
    echo "file: ${_file}"
  done < <(ls)
} && export -f printfiles
Run Code Online (Sandbox Code Playgroud)

< <(FUNCTION)bash特定的语法,不支持的sh。当我使用 ssh 登录到远程机器时:

$ ssh my.remote
me@xxx.xx.xxx.xx's password: 
Last login: Fri Nov 17 11:27:39 2017 from yyy.yy.yy.yy
sourcing /home/me/.bash_profile
SHELL: /bin/bash
Run Code Online (Sandbox Code Playgroud)

它工作正常。现在我想再次登录但转发我的X11

$ ssh -X my.remote
me@xxx.xx.xxx.xx's password: 
sh: printfiles: line 2: syntax error …
Run Code Online (Sandbox Code Playgroud)

ssh bash shell sh x11-forwarding

5
推荐指数
1
解决办法
195
查看次数

Bash 脚本:创建一个屏幕会话并在其中执行命令

我想写一个 bash 文件,它启动一个屏幕会话并在里面执行一个命令。

问题是,它首先创建一个会话,当您手动退出会话时,它会执行下一个命令。有没有办法在会话内执行命令?

这是我的代码,直到现在:

#!/bin/bash
screen -S test
python3 test.py
Run Code Online (Sandbox Code Playgroud)

display bash shell python sh

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

如何或在哪里定义要在 bash、zsh、sh 脚本中使用的全局函数?

假设我有这三个脚本文件:(所有 3 个都是可执行的)

bash-test.sh:

#!/bin/bash
HelloFromBash RocketNuts
Run Code Online (Sandbox Code Playgroud)

zsh-test.sh:

#!/bin/zsh
HelloFromZsh RocketNuts
Run Code Online (Sandbox Code Playgroud)

sh-test.sh:

#!/bin/sh
HelloFromSh RocketNuts
Run Code Online (Sandbox Code Playgroud)

从 shebang 中您可以看出,这些脚本分别由不同的 shell 执行,即bashzsh、 和sh

这三个函数“HelloFromXyz”全部应该像这样定义:
function HelloFromBash { echo "Hello $1, this is Bash speaking" }
对于 zsh 和 sh 变体来说类似。

但问题是:我想在全局范围内定义这些函数,每个特定的 shell 都有一个函数。

如何或在哪里为这三个 shell 定义全局函数?这样,当我运行上面的三个脚本时,它们每个都可以使用该 shell 的特定全局函数。

如果有一种统一的方法可以同时为多个 shell 定义(或导出,或任何适当的术语)全局函数,那就更好了。但我相信情况并非如此,每个 shell 似乎都使用自己的机制。

(编辑)我知道无论是交互式 shell 和/或登录 shell 都可能存在差异。我希望该函数在所有情况下都可以在 shell 脚本中使用。所以我可以手动打开终端,并运行使用所述全局函数的脚本。或者我可以运行一个调用相同 shell 脚本的后台进程。
如果这需要在多个文件中定义或导出相同的函数,或者在另一个文件中包含/采购一个函数,我很想了解详细信息。

bash zsh sh shell-script global

5
推荐指数
1
解决办法
4583
查看次数

有没有办法在linux中删除特定命令的root要求?如果是,怎么会?

我正在使用 Ubuntu 12.04 LTS,并且我正在尝试使特定命令

dhclient
Run Code Online (Sandbox Code Playgroud)

不需要root权限。我做了一些研究,让我相信我可以解锁一个“su”用户,它不需要任何 root 权限,但恐怕我会以这种方式破坏某些东西。

也许我在问两个不同的问题:

  1. 不需要 root 权限的所有命令都驻留在我的操作系统中的什么位置?

  2. 我可以把这个命令移到那里吗?

任何方式都适用于我的情况,老实说,我什至不确定常规用户的命令是否与其他命令区分开来。

linux root sh su

4
推荐指数
1
解决办法
2655
查看次数

Linux:如何评估 STDOUT 的内容?

假设您有一个带有某种终端命令的文件。每行如何执行?你能把 more 的输出传送到一个eval?

%> more ./foo.txt
Run Code Online (Sandbox Code Playgroud)

编辑:

在从评论中获得一些帮助/指导之后,我想我还应该注意,我已经有一段时间没有完成任何 shell 脚本了,所以虽然我说eval我可能是指echo或其他一些执行代码的方式。

如果 foo.txt 包含多行代码,但我想执行包含 的行echo 'bar bar',我正在寻找一种方法来做到这一点,假设一个grep. 逻辑上类似于:

grep echo foo.txt | xargs echo
Run Code Online (Sandbox Code Playgroud)

linux bash sh tcsh

4
推荐指数
1
解决办法
3513
查看次数

如何在shell脚本中使用source命令?

我想source在 shell 脚本中使用命令。

我所做的如下所示:

start.sh

source ~/tensorflow/bin/activate
Run Code Online (Sandbox Code Playgroud)

然后在命令行中运行这个脚本。

$sh start.sh
Run Code Online (Sandbox Code Playgroud)

然而什么也没有发生

$which source
Run Code Online (Sandbox Code Playgroud)

命令不显示任何内容。

那么,source是不是正常的命令?

这是错误的想法吗?或者如何减少路径类型?

shell sh

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

sh源找不到文件

我安装的是 Ubuntu 20.04。我似乎无法使用 来获取文件sh,这是 Ubuntu 的默认设置dash

我有一个文件,build.env其中包含一些环境变量,如下所示:

构建环境:

SOMEVAR=something
A_VAR=some_value
Run Code Online (Sandbox Code Playgroud)

. build.env我可以使用或在 bash 上获取它source build.env。但是,如果我尝试. build.env使用 sh,我会得到

sh: 1: .: build.env: not found. 
Run Code Online (Sandbox Code Playgroud)

我可以statcat该文件,但我无法获取它的来源。为什么?

sh dash-shell

4
推荐指数
1
解决办法
1791
查看次数

标签 统计

sh ×10

bash ×6

shell ×4

linux ×2

sed ×2

shell-script ×2

dash-shell ×1

display ×1

find-and-replace ×1

global ×1

python ×1

root ×1

ssh ×1

su ×1

tcsh ×1

x11-forwarding ×1

zsh ×1