Hack 3. Perform mkdir and cd Using a Single Command

本文介绍了一种在Linux环境下,通过自定义bash函数mkdircd,实现同时创建目录并直接进入该目录的操作,提高工作效率。通过在当前用户home目录下编辑.bash_profile文件,新增该函数,只需执行一条命令即可完成创建目录和切换任务。
在linux系统中,我们经常会利用mkdir命令创建目录,并且cd到该目录下做一些必要的工作。
例如:
[clu@portal.ny1 ~]$ mkdir -p /tmp/subdir1/subdir2/subdir3
[clu@portal.ny1 ~]$ cd /tmp/subdir1/subdir2/subdir3
[clu@portal.ny1 subdir3]$ pwd
/tmp/subdir1/subdir2/subdir3
[clu@portal.ny1 subdir3]$


那么有没有更快的方法将两条命令结合起来操作,使得我们只要执行一条命令就可以既创建了目录,也cd到该目录了尼。有的,方法如下:
在[b]当前用户的home目录[/b]下,
[clu@portal.ny1 ~]$ pwd
/home/staff/clu
[clu@portal.ny1 ~]$ vi .bash_profile

新增一个方法:
function mkdircd(){
mkdir -p "$@" && eval cd "\"\$$#\"";
}


然后退出,重新登陆linux。
这样直接执行:
[clu@portal.ny1 ~]$ mkdircd /tmp/subdir1/subdir2/subdir3
[clu@portal.ny1 subdir3]$ pwd
/tmp/subdir1/subdir2/subdir3


这样就快多了

--EOF--
<think>我们正在处理一段ABAP代码,它包含一系列PERFORM语句。在ABAP中,PERFORM用于调用子程序(也称为表单)。这段代码有三个PERFORM语句,分别调用三个不同的子程序:frm_time_calc(带有参数&#39;INIT&#39;)、frm_get_data和frm_time_calc(带有参数&#39;CALC&#39;)。 这段代码的功能可能是: 1. 首先,调用frm_time_calc子程序并传递参数&#39;INIT&#39;。这可能是初始化一个计时器或记录开始时间。 2. 然后,调用frm_get_data子程序,这可能是获取数据的主要过程。 3. 最后,再次调用frm_time_calc子程序并传递参数&#39;CALC&#39;,这可能是计算并输出从开始到结束的时间(性能测量)。 由于用户要求我们作为编程专家给出解决方案,并解释代码,我们需要提供ABAP代码的示例,并解释每个部分。 但是,用户提供的代码片段非常简短,所以我们可能需要补充一些上下文。例如,我们需要定义这些子程序(表单)可能是什么样子。 让我们分别创建这三个子程序的示例代码: 1. frm_time_calc: 这个子程序可能用于初始化计时器(当参数为&#39;INIT&#39;)和计算并显示经过的时间(当参数为&#39;CALC&#39;)。 2. frm_get_data: 这个子程序用于获取数据,这里我们可以假设它从数据库表中读取一些数据。 注意:在ABAP中,我们使用`FORM`和`ENDFORM`定义子程序,使用`PERFORM`调用子程序。 下面是一个示例程序,包含这三个子程序的实现: ```abap REPORT z_perform_example. DATA: gv_start_time TYPE timestampl, " 用于记录开始时间 gv_end_time TYPE timestampl, " 用于记录结束时间 gv_seconds TYPE timestampl. " 用于存储时间差(秒) * 主程序 START-OF-SELECTION. PERFORM frm_time_calc USING &#39;INIT&#39;. PERFORM frm_get_data. PERFORM frm_time_calc USING &#39;CALC&#39;. * 时间计算表单 FORM frm_time_calc USING pv_mode TYPE char4. CASE pv_mode. WHEN &#39;INIT&#39;. GET TIME STAMP FIELD gv_start_time. WRITE: / &#39;开始时间:&#39;, gv_start_time. WHEN &#39;CALC&#39;. GET TIME STAMP FIELD gv_end_time. gv_seconds = gv_end_time - gv_start_time. WRITE: / &#39;结束时间:&#39;, gv_end_time. WRITE: / &#39;耗时:&#39;, gv_seconds, &#39;秒&#39;. ENDCASE. ENDFORM. * 获取数据表单 FORM frm_get_data. " 这里模拟从数据库表中读取数据,例如选择一些数据 " 为了示例,我们只是等待2秒来模拟耗时操作 WAIT UP TO 2 SECONDS. WRITE: / &#39;数据获取完成!&#39;. ENDFORM. ``` ### 代码解释: 1. **全局变量定义**: - `gv_start_time` 和 `gv_end_time`:用于存储时间戳,记录开始和结束时间。 - `gv_seconds`:用于存储两个时间戳之间的差值(以秒为单位)。 2. **主程序 (START-OF-SELECTION)**: - 首先,调用 `frm_time_calc` 并传递参数 `&#39;INIT&#39;` 来记录开始时间。 - 然后,调用 `frm_get_data` 来获取数据(这里用等待2秒模拟)。 - 最后,调用 `frm_time_calc` 并传递参数 `&#39;CALC&#39;` 来记录结束时间并计算耗时。 3. **表单 `frm_time_calc`**: - 使用 `CASE` 语句根据传入的参数 `pv_mode` 执行不同的操作。 - 当 `pv_mode = &#39;INIT&#39;`:获取当前时间戳并存入 `gv_start_time`,并输出开始时间。 - 当 `pv_mode = &#39;CALC&#39;`:获取当前时间戳存入 `gv_end_time`,计算时间差(`gv_end_time - gv_start_time`),并输出结束时间和耗时。 4. **表单 `frm_get_data`**: - 这里只是模拟数据获取,使用 `WAIT UP TO 2 SECONDS` 让程序等待2秒,然后输出一条消息。 ### 注意事项: - 在实际应用中,`frm_get_data` 可能会包含从数据库表中选择数据的操作(例如使用 `SELECT` 语句)。 - 时间戳类型 `timestampl` 是ABAP中用于高精度时间记录的字段,可以精确到微秒。计算两个时间戳的差值得到的是以秒为单位的浮点数(类型为`decfloat34`)。 ### 运行结果示例: ``` 开始时间:20240505123456.123456 数据获取完成! 结束时间:20240505123458.123456 耗时:2.000000秒 ``` §§相关问题§§: 1. ABAP中除了使用时间戳类型,还有哪些时间类型? 2. 在ABAP中如何从数据库表中读取数据? 3. ABAP中子程序(FORM)和函数模块(FUNCTION)有什么区别? 4. 如何优化ABAP程序的性能? </think>以下是针对提供的 ABAP 代码的分析和完整实现: ### 代码分析 ```abap START-OF-SELECTION. PERFORM frm_time_calc USING &#39;INIT&#39;. " 初始化计时器 PERFORM frm_get_data. " 执行数据获取逻辑 PERFORM frm_time_calc USING &#39;CALC&#39;. " 计算并输出耗时 ``` 1. **START-OF-SELECTION**:ABAP 程序的入口点 2. **PERFORM 语句**:调用子程序 - `frm_time_calc &#39;INIT&#39;`:初始化性能计时器 - `frm_get_data`:核心数据获取逻辑 - `frm_time_calc &#39;CALC&#39;`:计算并输出耗时 ### 完整实现代码 ```abap REPORT z_performance_measurement. DATA: gv_start_time TYPE timestamp, " 记录开始时间 gv_end_time TYPE timestamp, " 记录结束时间 gv_seconds TYPE p DECIMALS 3. " 存储耗时(秒) * 主程序入口 START-OF-SELECTION. PERFORM frm_time_calc USING &#39;INIT&#39;. PERFORM frm_get_data. PERFORM frm_time_calc USING &#39;CALC&#39;. * 性能计时子程序 FORM frm_time_calc USING pv_mode TYPE char4. CASE pv_mode. WHEN &#39;INIT&#39;. GET TIME STAMP FIELD gv_start_time. " 记录开始时间戳 WRITE: / &#39;计时开始于: &#39;, gv_start_time. WHEN &#39;CALC&#39;. GET TIME STAMP FIELD gv_end_time. " 记录结束时间戳 gv_seconds = gv_end_time - gv_start_time. " 计算时间差 WRITE: / &#39;计时结束于: &#39;, gv_end_time. WRITE: / &#39;总耗时: &#39;, gv_seconds, &#39;秒&#39;. ENDCASE. ENDFORM. * 数据获取子程序(示例) FORM frm_get_data. " 模拟耗时操作:从数据库表读取数据 SELECT * FROM sflight INTO TABLE @DATA(lt_flights) UP TO 1000 ROWS. " 处理数据(示例) LOOP AT lt_flights ASSIGNING FIELD-SYMBOL(<fs_flight>). <fs_flight>-price = <fs_flight>-price * &#39;1.10&#39;. " 价格上调10% ENDLOOP. WRITE: / &#39;已处理&#39;, lines( lt_flights ), &#39;条航班数据&#39;. ENDFORM. ``` ### 关键代码解释 1. **时间测量原理**: - `GET TIME STAMP`:获取精确到毫秒的系统时间戳 - 时间差计算:ABAP 自动处理 `timestamp` 类型减法运算,结果单位为秒 2. **数据获取子程序**: - 从 `SFLIGHT`(航班数据表)读取最多1000行 - 使用 `FIELD-SYMBOL` 动态修改数据(价格增加10%) - `UP TO N ROWS` 限定数据量(防止性能问题) 3. **性能优化特性**: - 使用 `INTO TABLE` 替代逐行读取(减少数据库交互) - 字段符号(`FIELD-SYMBOL`)避免数据复制开销 ### 执行结果示例 ``` 计时开始于: 20240605102512.429837 已处理 347 条航班数据 计时结束于: 20240605102512.873451 总耗时: 0.443 秒 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值