标签: bash

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中将引号插入字符串变量

有没有办法在字符串变量的开头和结尾插入引号?

我有这个变量说:

string="desktop/first folder"
Run Code Online (Sandbox Code Playgroud)

如果我回应这个,它会显示:

desktop/first folder
Run Code Online (Sandbox Code Playgroud)

我需要将字符串存储为:

"desktop/first folder"
Run Code Online (Sandbox Code Playgroud)

bash string bash-scripting

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

将专辑插图添加到 MP3 文件而不会降低音频质量

我想将一张图片作为专辑插图添加到 MP3 文件中,而不会降低音频质量。我在 Debian 上使用 FFmpeg,命令如下:

ffmpeg -i input.mp3 -i cover.jpg -c copy -c:a libmp3lame -map 0 -map 1 out.mp3
Run Code Online (Sandbox Code Playgroud)

我不知道这是否libmp3lame1是错误,但输出文件的比特率与原始文件的比特率不同。通过查看输入和输出文件之间的文件大小差异可以很容易地注意到这一点,因为输出文件比输入文件小几 MB。

正如@Yorik在回答中所建议的那样,我删除了libmp3lame编码参数。然而,这导致了另一个问题。如果输入和输出文件是一样的(即我想把封面图jpg添加到同一个文件中,而不生成新的),好像只处理了第一帧,结果是一个很小的文件(即 176kB) 没有任何音频。

这是我现在使用的 FFmpeg 命令:

ffmpeg -i test.mp3 -i cover.jpg -c copy -c:a libmp3lame -map 0 -map 1 test.mp3
Run Code Online (Sandbox Code Playgroud)

audio mp3 bash ffmpeg

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

SSH 不通过 LANG 环境变量

我正在运行 Debian 服务器(uname -v输出#1 SMP Debian 4.9.65-3+deb9u1 (2017-12-23))。当我从多个客户端(带有默认 ssh 的 macOS 10.13 笔记本电脑、iOS 上的“提示”应用程序等)中的任何一个登录时LANG=C,尽管LANG=en_US.UTF-8从客户端传入。以下是一些相关信息:

client$ env | grep LANG
LANG=en_US.UTF-8
client$ ssh -v server
...
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
server$ env | grep LANG
LANG=C
server$ grep -in lang /etc/profile ~/.bash_profile ~/.bash_login ~/.profile ~/.bash_logout ~/.bashrc
grep: ~/.bash_profile: No such file or directory
grep: ~/.bash_login: No such file or directory
server$ locale -a
C
C.UTF-8
POSIX
en_US.utf8
server$ …
Run Code Online (Sandbox Code Playgroud)

ssh debian bash environment-variables sshd

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

如何链接 awk 打印语句?

好的,这是一个简单的例子;我分三步隔离主机的 IPV4:

ip -br a  
lo               UNKNOWN        127.0.0.1/8 ::1/128 
eth0             DOWN           
wlan0            UP             192.168.0.101/24 fe80::9fcd:45fb:1e0f:a1cc/64 
Run Code Online (Sandbox Code Playgroud)
ip -br a | awk '/wlan0/ {print $3}'  
192.168.0.101/24
Run Code Online (Sandbox Code Playgroud)
ip -br a | awk '/wlan0/ {print $3}' | awk -F '/' '{print $1}'
192.168.0.101
Run Code Online (Sandbox Code Playgroud)

而不是调用awk(将一个的输出传送到下一个)的第二个实例;怎么能一蹴而就?


只想说:问题不在于解析ip. 我只需要一个简单的例子来帮助说明这个问题;这是我想到的第一件事。真正的问题总结在标题中。

无论如何,它的价值(我必须检查它,但我很确定);这就是我在(最近)过去所做的:

ip -br a s dev wlan0 | awk -F '[ /]*' '{print $3}'
192.168.0.101
Run Code Online (Sandbox Code Playgroud)

bsd bash gnu awk text-manipulation

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

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

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

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

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

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

display bash shell python sh

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

在 sed 中查找和替换排除案例

我试图sed在某个模式后添加一个字符串,但我想排除已经存在附加字符串的情况。

例如:

"text.txt"

Hello
Bar
Hello world!
Run Code Online (Sandbox Code Playgroud)

如果我使用sed -i -e 's/Hello/Hello world!' text.txt第三行就变成

Hello world! world!

但我想保持它完好无损。

我发现了这个相关的问题,但并非我的文件中的所有行都需要修改。

有人有这个食谱吗?

linux bash sed

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

如何将命令行提示符保留在终端的第一行?

我需要将命令行保持在屏幕顶部,并查看其下方的任何命令的输出。如何使用任何平台上的任何可用工具来实现这一目标?

目前,在我使用过的所有终端模拟器上,如果您运行ls foo -l,结果将是:

$ ls foo -l
hi.txt
bye.txt
$ command prompt is here
Run Code Online (Sandbox Code Playgroud)

在喜欢看到这个:

$ command prompt is here
$ ls foo -l
hi.txt
bye.txt
Run Code Online (Sandbox Code Playgroud)

terminal bash command-line cmd.exe

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

如何以编程方式清除 Windows 中的缓冲区和缓存

我需要bash在 Cygwin 环境中对某些命令的速度进行基准测试,并确保我正在运行的测试不会命中 Windows 缓冲区或缓存。尽管我是在bash环境中进行基准测试,但我怀疑所有缓存都是由 Windows 本身完成的,而不是 Cygwin。

在基于Unix 的系统上,您可以执行以下操作来清除所有缓存和缓冲区:

echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)

这个命令在 Windows 上的等价物是什么?

windows cygwin bash cache buffer

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

在 Windows 上的 Ubuntu 上更改 Bash 的标题

是否可以更改 Windows 上 Ubuntu 上的 Bash 在其标题栏中显示的标题?默认情况下,它设置为<username>@<computername>:<CWD>. 我想说,Bash on Ubuntu on Windows:作为前缀添加到它。

我尝试了一些向.bashrc(例如使用xtitle)添加不同行的解决方案,但问题是 BoUoW 每次更改 CWD 时都会更改其标题,因此它会立即覆盖您在.bashrc.

有没有办法永久添加前缀或完全更改磁贴?

windows bash ubuntu windows-10 windows-subsystem-for-linux

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