问题与 .shell 脚本有关bash。
如何使用脚本检查当前目录中的哪些文件是软链接?
如果我使用了错误的术语,当我说soft links 时,我指的是使用ln -s.
我唯一能想到的是ls -la作为一个表达式进行评估,并解析它的结果,但这显然不是最好的解决方案。
我知道有一些选项可以使用指定的标题启动新终端,并且可以使用菜单从终端更改标题:“终端”-> 设置标题。
但是,我想从命令行为当前终端更改它。如何从命令行更改现有Gnome 终端的标题?
我使用一个脚本(我没有写访问权限)来创建一堆别名来设置环境。我想创建一个 bash 函数来设置我的环境,但似乎别名在函数体中不存在。
这是一个最小的例子:
# aliases.sh
alias fooAlias='echo "this will never work!"'
Run Code Online (Sandbox Code Playgroud)
.
# .bashrc
function setupLotsOfThings() {
source aliases.sh
fooAlias
}
Run Code Online (Sandbox Code Playgroud)
.
现在,如果我只是以aliases.sh交互方式获取源代码,那么事情会按预期进行:
[mycomputer]~/ $ source aliases.sh
[mycomputer]~/ $ fooAlias
this will never work!
Run Code Online (Sandbox Code Playgroud)
但是,如果我改为调用 .bashrc 中定义的函数,则在获取其定义后它无法识别别名:
[mycomputer]~/ $ setupLotsOfThings
-bash: fooAlias: command not found
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?alias在函数中使用时,我对命令的范围有什么遗漏吗?
编辑:我将添加一些超出最小示例的细节,以阐明我正在尝试完成的工作。
对于我的工作,我在集群和/或网格上开发和运行了很多软件。我有几个项目需要完全不同的环境,例如不同的 gcc 版本、特定的软件版本、配置和数据路径以及各种环境变量。管理员提供脚本来设置各种东西,通常是通过定义 shell 函数或别名来调用其他函数或别名或运行各种脚本。对我来说,这是一个黑匣子。
我想用一个命令设置我自己的各种环境。目前,我做这样的事情:
[mycomputer]~/ $ source /some/environment/setup/script.sh
[mycomputer]~/ $ aliasToSetupSomeSoftwareVersion #this was defined in the above
[mycomputer]~/ $ anotherAliasForOtherSoftware
[mycomputer]~/ $ source /maybe/theres/another/script.sh
[mycomputer]~/ …Run Code Online (Sandbox Code Playgroud) 我写了一个看起来像这样的脚本(不起作用):
#!/bin/sh
screen -dmS "somename" somecommand
for i in {0..5}; do
screen -dmS "name$i" anothercommand $i
done
Run Code Online (Sandbox Code Playgroud)
出于某种原因,如果我将其复制并粘贴到终端中,它会按照我的预期创建 7 个分离的屏幕会话。但是,如果我从脚本中运行它,当我运行screen -ls.
编辑:如果可以通过另一种方式完成相同的操作(例如,使用多个屏幕窗口而不是会话),我也会打开这些解决方案。谢谢!
以下是我想作为 bash 脚本的一部分运行的 python one-liner
python -c "from xml.dom.minidom import parse;dom = parse('/path/to/pom.xml');print [n.firstChild.data for n in dom.childNodes[0].childNodes if n.firstChild and n.tagName == 'version']"
Run Code Online (Sandbox Code Playgroud)
(pom.xml 是一个 maven POM xml 文件)
我想将命令的结果分配给变量MVN_VER
这是我的基本脚本:
WS="/path/to"
PY_GET_MVN_VERS="from xml.dom.minidom import parse;dom = parse(\'${WS}/pom.xml\')\;print [n.firstChild.data for n in dom.childNodes[0].childNodes if n.firstChild and n.tagName == \'version\']"
funcion test_mvn {
MVN_VER=`python -c \"${PY_GET_MVN_VERS}\"`
echo ${MVN_VERS}
}
test_mvn
Run Code Online (Sandbox Code Playgroud)
但是它无法运行。如果我使用 +x 选项运行脚本,我会看到:
++ python -c '"from' xml.dom.minidom import 'parse;dom' = 'parse(\'\''/path/to/pom.xml\'\'')\;print' '[n.firstChild.data' for n in 'dom.childNodes[0].childNodes' if n.firstChild …Run Code Online (Sandbox Code Playgroud) 我在 Windows 上使用 msysgit 来使用 git,但我经常想通过 Windows 风格的*.lnk快捷方式进行导航。我通常通过 Windows 的资源管理器管理我的文件结构,因此使用不同类型的快捷方式(例如在 git 中创建硬链接或软链接)是不可行的。我将如何浏览这种类型的快捷方式?
例如:
PCUser@PCName ~
$ cd Desktop
PCUser@PCName ~/Desktop
$ ls
Scripts.lnk
PCUser@PCName ~/Desktop
$ cd Scripts.lnk
sh.exe": cd: Scripts.lnk: Not a directory
Run Code Online (Sandbox Code Playgroud)
是否可以更改此行为,以便它不会出错,而只会转到目录的位置?或者,是否有获取*.lnk文件路径的命令?
编辑:我听说cygwin存在相反的情况,允许您创建一个与资源管理器一起使用的符号链接。
NFS 共享已挂载到/vol/mynfsLinux 客户端。它不显示任何文件夹,ls并且 bash 完成也不起作用/vol/mynfs。但是在更改到子目录后,所有文件都可见。
$ ls /vol/mynfs
total 0
$ cd /vol/mynfs/test
$ ls # shows all files as expected now.
Run Code Online (Sandbox Code Playgroud)
为什么文件首先不可见,如何使它们始终可见?
我有一个位图,我想将它连接到许多视频的前面,作为一种标题屏幕或免责声明屏幕。
我尝试将其转换为与视频其余部分具有相同属性的视频。所以首先我反省视频:
ffmpeg version 2.2.1 Copyright (c) 2000-2014 the FFmpeg developers
built on Apr 11 2014 22:50:38 with Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
configuration: --prefix=/usr/local/Cellar/ffmpeg/2.2.1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
libavutil 52. 66.100 / 52. 66.100
libavcodec 55. 52.102 / 55. 52.102
libavformat 55. 33.100 / 55. 33.100
libavdevice 55. 10.100 / 55. 10.100
libavfilter 4. 2.100 / 4. 2.100
libavresample 1. 2. 0 / 1. …Run Code Online (Sandbox Code Playgroud) 我dtruss在 Mac OS X 10.9 上运行。简单的例子是:
sudo -c ls
Run Code Online (Sandbox Code Playgroud)
但我想将dtruss输出捕获到一个文件中。我看到一些东西表明我可以做这样的事情:
sudo bash -c 'dtruss -c ls >x'
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时,输出dtruss仍然会进入终端,并且来自的文件列表ls被重定向到该文件。
如何将输出重定向dtruss到文件?
我一直在尝试创建一个临时命名的 fifo 并在引用Bash: create anonymous fifo我看到他们正在使用mktemp -u来获取 fifo 的文件名。手册页指出这是不安全的。
-u, --dry-run
do not create anything; merely print a name (unsafe)
Run Code Online (Sandbox Code Playgroud)
为什么这是不安全的,我如何负责任地使用这种技术?
bash ×10
linux ×2
ffmpeg ×1
gnome ×1
gnu-screen ×1
ln ×1
ls ×1
macos ×1
mount ×1
mpeg ×1
msysgit ×1
nfs ×1
redirection ×1
script ×1
shell-script ×1
sudo ×1
ubuntu-11.04 ×1
video ×1
windows ×1