我想要一种快速而简单的方法来在文件更改时执行命令。我想要一些非常简单的东西,我会在终端上运行并在我完成处理该文件时关闭它。
目前,我正在使用这个:
while read; do ./myfile.py ; done
Run Code Online (Sandbox Code Playgroud)
然后Enter,每当我将该文件保存在我的编辑器中时,我都需要转到该终端并按。我想要的是这样的:
while sleep_until_file_has_changed myfile.py ; do ./myfile.py ; done
Run Code Online (Sandbox Code Playgroud)
或任何其他简单的解决方案。
顺便说一句:我正在使用 Vim,我知道我可以添加一个自动命令来在 BufWrite 上运行一些东西,但这不是我现在想要的那种解决方案。
更新:如果可能的话,我想要一些简单的、可丢弃的。更重要的是,我想在终端中运行一些东西,因为我想查看程序输出(我想查看错误消息)。
关于答案:感谢您的所有回答!他们都非常好,每个人都采用与其他人截然不同的方法。因为我只需要接受一个,所以我接受了我实际使用过的一个(它简单、快速且易于记忆),尽管我知道它不是最优雅的。
执行像 A 这样的 Bash 脚本和采购像 B 这样的 Bash 脚本有什么区别?
A
> ./myscript
B
> source myscript
Run Code Online (Sandbox Code Playgroud) 我通过搜索 Google 编写了以下脚本,它将我的 Linux 系统备份到存档:
#!/bin/bash
# init
DATE=$(date +20%y%m%d)
tar -cvpzf /share/Recovery/Snapshots/$HOSTNAME_$DATE.tar.gz --exclude=/proc --exclude=/lost+found --exclude=/sys --exclude=/mnt --exclude=/media --exclude=/dev --exclude=/share/Archive /
Run Code Online (Sandbox Code Playgroud)
这有效,但我想知道我是否可以格式化脚本以在多行上显示命令,类似于这样,以便以后轻松编辑:
tar -cvpzf /share/Recovery/Snapshots/$HOSTNAME_$DATE.tar.gz
--exclude=/proc
--exclude=/lost+found
--exclude=/sys
--exclude=/mnt
--exclude=/media
--exclude=/dev
--exclude=/share/Archive
/
Run Code Online (Sandbox Code Playgroud)
这样以后阅读和编辑就更容易了。是否可以通过这种方式格式化 Bash 脚本?
有没有人写了一个 bash 函数来将一个目录添加到 $PATH 中,如果它不存在?
我通常使用以下内容添加到 PATH:
export PATH=/usr/local/mysql/bin:$PATH
Run Code Online (Sandbox Code Playgroud)
如果我在 .bash_profile 中构建我的 PATH,那么它不会被读取,除非我所在的会话是登录会话——这并不总是正确的。如果我在 .bashrc 中构建我的 PATH,那么它会与每个子 shell 一起运行。因此,如果我启动一个终端窗口,然后运行 screen 然后运行一个 shell 脚本,我会得到:
$ echo $PATH
/usr/local/mysql/bin:/usr/local/mysql/bin:/usr/local/mysql/bin:....
Run Code Online (Sandbox Code Playgroud)
我将尝试构建一个名为 bash 的函数add_to_path(),如果它不存在,它只会添加目录。但是,如果有人已经写过(或找到)这样的东西,我不会花时间在上面。
如何让屏幕执行命令然后分离(即,自动在单个脚本中,除了最初启动脚本之外无需进一步输入)?例如,我运行 myscript.sh,它会自动启动一个屏幕会话,执行一个命令,然后分离。
到目前为止,我们正在使用 Bash 编写所有脚本,但我开始觉得它有点傻。虽然我们当然可以用 Bash 做我们想做的一切(它非常强大),但我开始怀疑我们是否不应该使用适当的脚本语言(在我们的例子中很可能是 Ruby)。
您如何决定何时在脚本中使用 Perl/Python/Ruby 而不是 Bash?我认为使用 Ruby 的 init 脚本没有意义,但是添加电子邮件帐户的稍长脚本怎么样?
我想从文件夹结构中删除所有文件,所以我只剩下一个空文件夹结构。
这可以在批处理或VBScript脚本中实现吗?
我尝试了一个非常基本的批处理命令,但这需要用户允许删除每个文件。这不是一个合适的解决方案,因为有数百个文件,并且随着时间的推移会大量增加。
你能提出什么建议?
有没有一种聪明的方法来执行复制和移动操作或命令来复制文件,而不必在同一文件夹中执行cd, 然后mv在之后?
例如,我必须运行以下命令:
mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt
Run Code Online (Sandbox Code Playgroud)
请注意,我将文件移动到的目录是相同的,但我必须再次放置整个路径,有时会很烦人。我很想知道是否有另一种方法可以做到这一点而不必再次放置整个路径,因为操作将在同一路径中完成。
有没有什么简单的方法可以将命令行参数附加到 Mac 上的应用程序?例如,要在 kiosk 模式下运行 Opera 或在 Firefox 中使用不同的配置文件,我可以输入
$ /Applications/Opera.app/Contents/MacOS/Opera -kioskmode
$ /Applications/Firefox.app/Contents/MacOS/firefox -P profilename -no-remote
Run Code Online (Sandbox Code Playgroud)
在 Windows 中,我可以将参数附加到快捷方式属性,但由于 Mac 本身不使用快捷方式并直接运行应用程序,因此这是不可能的。
我发现通过 bash 或 Applescript 启动应用程序部分有效:
# Bash
#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote
# Applescript
do shell script "exec /Applications/Opera.app/Contents/MacOS/Opera -kioskmode"
Run Code Online (Sandbox Code Playgroud)
我可以使这些可执行文件并分配一个图标,一切都很好,除了当我运行这些伪程序中的任何一个时,只要应用程序打开,终端窗口或 Applescript 图标就会保持打开状态。据推测,使用 Applescript 命令open可以避免这种情况,但是由于我没有在打包时运行该应用程序(只是/Applications/Firefox),所以它不起作用。
那么,有没有更好的方法来运行带有命令行参数的应用程序?如果没有,有没有办法防止持久的终端会话或 Applescript 图标在应用程序打开时保持打开状态?
编辑
根据Mozilla Wiki 页面,最好使用脚本来运行带参数的应用程序。&在脚本末尾添加 a会终止持久的终端窗口。现在唯一的烦恼是它打开了一个死的、注销的终端窗口(这比持久的要好,但仍然......)
#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote &
Run Code Online (Sandbox Code Playgroud) script ×10
bash ×5
linux ×5
command-line ×3
shell ×2
batch-file ×1
cron ×1
gnu-screen ×1
launchd ×1
mac ×1
macos ×1
path ×1
perl ×1
powershell ×1
ruby ×1
tar ×1
unix ×1
vbscript ×1
windows ×1